对Python中class和instance以及self的用法详解


Posted in Python onJune 26, 2019

一. Python 的类和实例

在面向对象中,最重要的概念就是类(class)和实例(instance),类是抽象的模板,而实例是根据类创建出来的一个个具体的 “对象”。

就好比,学生是个较为抽象的概念,同时拥有很多属性,可以用一个 Student 类来描述,类中可定义学生的分数、身高等属性,但是没有具体的数值。而实例是类创建的一个个具体的对象, 每一个对象都从类中继承有相同的方法,但是属性值可能不同,如创建一个实例叫 hansry 的学生,其分数为 93,身高为 176,则这个实例拥有具体的数值。

1.类:以Student类为例,在Python中,定义类如下:

class Student(object):
  def __init__(self,name,score):
    self.name=name
    self.score=score

a.(object)表示的是该类从哪个类继承下来的,而object类是每个类都会继承的一个类。 yt

b. __init__ 方法的第一参数永远是 self,用来表示类创建的实例本身,因此,在 __init__ 方法内部,就可以把各种属性绑定到self,因为self 本身就是指向创建的实例本身。

c. 有了 __init__ 方法后,在创建实例的时候,就不能传入空参数,必须传入与 __init__ 方法匹配的参数,但self本身不需要传入参数,只需要传入 self 后面的参数即可。

2.实例: 定义好了类后,就可以通过Student类创建出 Student 的实例,创建实例是通过 类名 + ()实现:

student = Student('name', 93)

>>> student.name
"name"
>>> student.score
93

a. 其中 Student 是类名称,('name',93)为要传入的参数

b. self.name 就是 Student类的属性变量,为 Student 类所有。同时, name 是外部传来的参数,不是 Student 类所自带的。故 self.name = name 的意思就是把外部传来的参数 name 的值赋值给 Student类自己的属性变量 self.name .

3.和普通函数相比,在类中定义函数只有一点不同,就是第一参数永远是类的本身实例变量 self, 并且调用时,不用传递该参数。 除此之外,类的方法(函数)和普通函数没有啥区别。既可以用 默认参数、可变参数或者关键字参数等。

二. 类 以及 实例的访问

1.限制外部对类实例属性的访问

既然 Student 类实例本身就拥有这些属性的数据,那么要访问这些数据,就没必要从外面的函数去访问,而可以在类的内部定义访问数据的函数,这样,就可以把 ”数据“ 封装起来了。这些封装数据的函数和 Student 类本身是相关联的,称之为类的方法:

class Student(obiect):
  def __init__(self, name, score):
    self.name = name
    self.score = score
  def print_score(self):
    print "%s: %d" % (self.name, self.score)
>>> student= Student("hansry",99)
>>> student.print_property()

hansry:99

由此可见,从外部看Student类,我们只知道创建实例需要给出 name 和 score。究竟如何打印,是 Student 类内部定义的,这些数据和逻辑被封装起来了,调用也就变得容易了,但是不知道内部实现的细节。

如果不想让实例中的内部属性被外部属性访问,则把 name 和 score 变成 __name 和 __score 即可,如下代码所示:

class Student(object):

  def __init__(self, name, score):
    self.__name = name
    self.__score = score
  def print_property(self):
    print "%s: %d" %(self.__name,self.__score)
>>> student= Student("hansry",99)
>>> student.print_property()
>>> student.__name()

hansry:99
Traceback (most recent call last):
AttributeError: 'Student' object has no attribute '__name'

2.开 API 使得外部代码能够访问到里面的属性,并且对其进行修改

外部代码访问到类实例属性,代码如下:

def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def get_name(self):
    return self.__name

  def get_score(self):
    return self.__score
name=student.get_name()
score=student.get_score()
print ("%s,%d" % (name,score))

外部代码修改类里面的实例属性,代码如下:

def __init__(self,name,score):
    self.__name=name
    self.__score=score
  def print_property(self):
    print("%s:%d"%(self.__name,self.__score))

  def reset_name(self,change_name):
    self.__name = change_name

  def reset_score(self, change_score):
    self.__score = change_score
student= Student("hansry",99)
student.print_property()
student.reset_name("simona")
student.reset_score(91)
name=student.get_name()
score=student.get_score()
print ("%s:%d" % (name,score))

hansry:99
simona:91

需要注意的是,在Python中,变量名类似 _xxx_的,也就是双下划线开头,并且以下划线结尾的,是特殊变量,特殊变量是可以直接访问的,不是 private 变量,不能用 __name__, __score__ 。

三. self 的仔细用法

1.self代表类的实例,而非类。

class Student(object):
  def print_self(self):
    print(self)
    print(self.__class__)
student=Student()
student.print_self()

<__main__.Student object at 0x7fd9095aed90>
<class '__main__.Student'>

从上面例子可得,self代表的只是类的实例,而 self.__class__ 才是类。

2. 定义类的时候,self最好写上,因为它代表了类的实例。

3. 在继承时,传入的是哪个实例,就是那个传入的实例,而不是指定义了self的类的实例。

class Teacher(object):
  def __init__(self,teacher):
    self.teacher=teacher
    print(self.teacher)

  def print_self(self):
    print(self)

class Student(Teacher):
  def __init__(self,student):
    self.student=student    
    print(self.student)

  def print_self_1(self):
    print(self)
teacher=Teacher("hansry")
student=Student("simona")
student.print_self_1()
student.print_self()

hansry
simona
<__main__.Student object at 0x7fd9095b0950>
<__main__.Student object at 0x7fd9095b0950>

在运行 student.print_self() 的时候,这里是调用了 类 Teacher 的 print_self() 函数,此时虽然调用的是 类Teacher的函数,但是此时的实例 self 确是 类 Student 实例化时生成的。

以上这篇对Python中class和instance以及self的用法详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python操作ssh实现服务器日志下载的方法
Jun 03 Python
浅谈python类属性的访问、设置和删除方法
Jul 25 Python
Python编程之基于概率论的分类方法:朴素贝叶斯
Nov 11 Python
Django学习笔记之ORM基础教程
Mar 27 Python
Python实现矩阵相乘的三种方法小结
Jul 26 Python
python matplotlib库直方图绘制详解
Aug 10 Python
Django通用类视图实现忘记密码重置密码功能示例
Dec 17 Python
pytorch中tensor.expand()和tensor.expand_as()函数详解
Dec 27 Python
Python如何读取文件中图片格式
Jan 13 Python
python 链接sqlserver 写接口实例
Mar 11 Python
Python3获取cookie常用三种方案
Oct 05 Python
python小技巧——将变量保存在本地及读取
Nov 13 Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 #Python
对python 中class与变量的使用方法详解
Jun 26 #Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 #Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 #Python
Python Numpy 实现交换两行和两列的方法
Jun 26 #Python
python 字典操作提取key,value的方法
Jun 26 #Python
通过PYTHON来实现图像分割详解
Jun 26 #Python
You might like
php array_values 返回数组的值实例详解
2016/11/17 PHP
Yii框架引用插件和ckeditor中body与P标签去除的方法
2017/01/19 PHP
PHP基于递归算法解决兔子生兔子问题
2018/05/11 PHP
ThinkPHP中获取指定日期后工作日的具体日期方法
2018/10/14 PHP
PHP getDocNamespaces()函数讲解
2019/02/03 PHP
从sohu弄下来的flash中展示图片的代码
2007/04/27 Javascript
JS request函数 用来获取url参数
2010/05/17 Javascript
基于jquery的实现简单的表格中增加或删除下一行
2010/08/01 Javascript
jquery移动listbox的值原理及代码
2013/05/03 Javascript
js获取键盘按键响应事件(兼容各浏览器)
2013/05/16 Javascript
原生js实现移动开发轮播图、相册滑动特效
2015/04/17 Javascript
JS选取DOM元素的简单方法
2016/07/08 Javascript
Bootstrap基本插件学习笔记之标签切换(17)
2016/12/08 Javascript
微信小程序中使元素占满整个屏幕高度实现方法
2016/12/14 Javascript
原生js实现无缝轮播图效果
2017/01/11 Javascript
详解webpack 多入口配置
2017/06/16 Javascript
JS跳转手机站url的若干注意事项
2017/10/18 Javascript
微信小程序实现城市列表选择
2018/06/05 Javascript
vue-cli配置flexible过程详解
2019/07/04 Javascript
JavaScript 自定义html元素鼠标右键菜单功能
2019/12/02 Javascript
让mocha支持ES6模块的方法实现
2020/01/14 Javascript
详解Python中DOM方法的动态性
2015/04/11 Python
python实现单线程多任务非阻塞TCP服务端
2017/06/13 Python
对python3 Serial 串口助手的接收读取数据方法详解
2019/06/12 Python
Python编写打字训练小程序
2019/09/26 Python
解决Django中checkbox复选框的传值问题
2020/03/31 Python
PyTorch中model.zero_grad()和optimizer.zero_grad()用法
2020/06/24 Python
Ryderwear澳洲官网:澳大利亚高端健身训练装备品牌
2018/09/18 全球购物
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
客服专员岗位职责范本
2013/11/29 职场文书
松材线虫病防治方案
2014/06/15 职场文书
工程索赔意向书
2014/08/30 职场文书
房地产销售经理岗位职责
2015/02/02 职场文书
升职自我推荐信范文
2015/03/25 职场文书
青年志愿者活动感想
2015/08/07 职场文书
感恩教育主题班会
2015/08/12 职场文书