Python 类的属性与实例属性

放假归来 ~~~spa


1、概念

  • 类对象:类名
  • 实例对象:经过类建立的对象
  • 类属性:类对象所拥有的属性。归类全部,被类对象和实例对象所共有。
    类的公有属性能够在类外被访问。
  • 实例属性:实例对象所特有的属性,类对象不能拥有,即不能经过类对象调用。
    实例属性能够放在构造方法__init__()中,也能够在建立实例对象后,进行绑定。

2、举例说明

咱们经过建立一个学生类来进行说明。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

clipboard.png

当类属性为可变对象时,经过实例对象来修改类属性时,会修改类属性,且在删除实例属性时会报错。
因此,使用类对象来修改类属性,不要使用实例对象来修改类属性。date


❤ thanks for watching, keep on updating...
点个赞再走吧

相关文章
相关标签/搜索