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

經過上面的例子咱們能夠看到,類屬性爲全部實例和類所共有,經過 類名.類屬性 能夠更改類屬性,而且全部實例的類屬性也隨之改變,但經過 實例名.類屬性 來改變類屬性,該實例的該類屬性會變爲實例屬性,而不影響其餘實例的類屬性,之後經過 類名.類屬性 來更改類屬性,也不會影響到該實例的這個屬性了,由於它變爲實例屬性啦。
作用域

相關文章
相關標籤/搜索