Python 类属性与实例属性的关联

类属性是属于一个类的变量,就像是C++中类的静态成员变量,你只需将该属性定义在全部方法的做用域外,即为类属性,但通常是紧跟在类名后面,类属性为全部实例所共有,你能够经过 类名.属性 来调用类属性
python

>>> class A:  
    count = 0; #这就是类属性  
    def __init__(self):  
        A.count += 1  #每次调用该方法 count 自增 1  
    def output(self):  
        print(self.count)  
  
>>> a1 = A()  
>>> a1.output()  
1  
>>> A.count = 0  
>>> A.count  
0  
>>> a1.output()  (为何会是0,后面会详细说明)
0

实例属性是属于实例本身的属性,你能够在任何方法中添加新的实例属性,甚至在类外添加,Python会在实例属性初次使用时,建立该属性并赋值shell

>>> class A:  
    def __init__(self):  
        self.num = 1  #添加实例属性num  
    def again(self,name):  
        self.name = name #添加实例属性name  
  
          
>>> a1 = A()  
>>> a1.num  
1  
>>> a1.name #这时实例 a1 中尚未实例属性 name  
Traceback (most recent call last):  
  File "<pyshell#38>", line 1, in <module>  
    a1.name #这时实例 a1 中尚未实例属性 name  
AttributeError: 'A' object has no attribute 'name'  
>>> a1.again('Jane')  
>>> a1.name #如今有了...  
'Jane'  
>>> a1.call = '123456' #添加a1的实例属性 call  
>>> a1.call  
'123456'

继续看下面的例子:spa

[python] view plaincopy
>>> class A:  
    count = 0  
    def __init__(self):  
        A.count += 1  
    def output(self):  
        print(self.count)  
  
          
>>> a1 = A()  
>>> a2 = A()  
>>> a3 = A()  
>>> A.count # A的类属性count这时为3  
3  
>>> A.count = 2 #更改A的类属性为2  
>>> a1.count,a2.count, a3.count, A.count #A的全部实例的count也一样改变  
(2, 2, 2, 2)  
>>> a1.count = 5 #经过A的一个实例a1更改count  
>>> a1.count, a2.count, a3.count, A.count #只有a1的count发生改变  
(5, 2, 2, 2)  
>>> A.count = 4 #再次更改A的类属性为4  
>>> a1.count, a2.count, a3.count, A.count  #这时a1的count仍是保持为5  
(5, 4, 4, 4)

解释为何会是0?code

先看代码:
对象

class base:
    count = 0
    def __init__(self):
        base.count += 1
    def output(self):
        print(self.count)
a1 = base()
a2 = base()
a3 = base()


print(base.count) # 3
a1.output() # 3  这里实例属性与类仍然仍是共同引用一个count对象
base.count += 4
a1.output() # 3+4

print(base.count) # 3
print(a1.count) # 3 同理,共同引用一个count对象
base.count = 0 当改变类属性count时,实例属性count也跟着会变化
print(a1.count) # 0
class base:
    count = 0
    def __init__(self):
        base.count += 1
    def output(self):
        print(self.count)
a1 = base()
a2 = base()
a3 = base()


print(base.count) # 3
a1.count = 9  这个实例属性从类属性中分离出去
base.count += 4 所以类属性count的改变不会影响到实例属性count
print(base.count) # 7
print(a1.count) # 9

print(base.count) # 3
a1.count = 9
base.count += 4
print(base.count) # 7
a1.output() # 9

经过上面的例子咱们能够看到,类属性为全部实例和类所共有,经过 类名.类属性 能够更改类属性,而且全部实例的类属性也随之改变,但经过 实例名.类属性 来改变类属性,该实例的该类属性会变为实例属性,而不影响其余实例的类属性,之后经过 类名.类属性 来更改类属性,也不会影响到该实例的这个属性了,由于它变为实例属性啦。
作用域

相关文章
相关标签/搜索