放假归来 ~~~spa
__init__()
中,也能够在建立实例对象后,进行绑定。咱们经过建立一个学生类来进行说明。code
class Student1(object): version = 1.0 # 类的公有数据属性 __v = 66 # 类的私有数据属性 # 构造方法里的实例属性,在类建立实例时自动被调用 def __init__(self ,name,score): self.name = name self.score = score # 类的方法属性,经过类实例化对象访问 def updateScore(self,new_score): self.score = new_score
then,尝试经过类对象和实例对象来访问类的公有数据属性。对于实例没有而类有的属性,会继续查找类的属性。对象
>>> b = Student1('xlp','100') >>> Student1.version # 经过类来访问类的数据属性 1.0 >>> b.version # 经过类实例访问类的数据属性,打印version属性 1.0 # 由于实例并无该属性,因此会继续查找class的version属性
but,当类属性和实例属性相同且混用的时候,会出现点问题。
咱们先经过类来修改类的数据属性。修改后,类和实例对象都可访问。ip
>>>Student1.version += 0.1 >>>Student1.version # 或者b.version 1.1
再经过类实例对象来修改类属性:it
>>>b.version += 0.1 # 试图经过类对象来修改类属性 >>>b.version # 效果等同于b.version = Student.version + 0.1 1.2 # 因为实例属性优先级高于类属性,所以会屏蔽掉类的version属性 1.1 >>>Student1.version 1.1 # 此时Student.version仍为1.1
其实,在上面实例对象修改类数据属性时,建立了一个名为version的新实例属性,覆盖了类属性的引用。
可是类自己的数据属性没有受到影响,仍存在类域中,能够经过类属性访问。
若是将b.version属性进行删除del,以后b.version就能够从新访问类数据属性了。io
>>>del b.version # 删除实例属性 >>>b.version # 因为实例的version属性没有找到,类的属性就显示出来了 1.1
因此,实例属性和类属性不要使用相同的名字。由于相同名称的实例属性将屏蔽掉类属性。class
能够经过实例绑定、访问实例的属性,举例说明:cli
>>> b.name 'xlp' >>>b.updateSocore(100) # 经过实例访问类方法属性 >>>b.score 100
可是,可是,可是,当类数据属性为可变对象时,好比dict类型,状况又会有点不同了。例如:object
当类属性为可变对象时,经过实例对象来修改类属性时,会修改类属性,且在删除实例属性时会报错。
因此,使用类对象来修改类属性,不要使用实例对象来修改类属性。date
❤ thanks for watching, keep on updating...
点个赞再走吧