標籤:
類屬性是屬於一個類的變數,就像是C++中類的靜態成員變數,你只需將該屬性定義在所有方法的範圍外,即為類屬性,但一般是緊跟在類名後面,類屬性為所有執行個體所共有,你可以通過 類名.屬性 來調用類屬性
>>> 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會在執行個體屬性初次使用時,建立該屬性並賦值
>>> 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‘
繼續看下面的例子:
[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?
先看代碼:
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) # 3a1.output() # 3 這裡執行個體屬性與類仍然還是共同引用一個count對象base.count += 4a1.output() # 3+4print(base.count) # 3print(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) # 3a1.count = 9 這個執行個體屬性從類屬性中分離出去base.count += 4 因此類屬性count的改變不會影響到執行個體屬性countprint(base.count) # 7print(a1.count) # 9print(base.count) # 3a1.count = 9base.count += 4print(base.count) # 7a1.output() # 9
通過上面的例子我們可以看到,類屬性為所有執行個體和類所共有,通過 類名.類屬性 可以更改類屬性,並且所有執行個體的類屬性也隨之改變,但通過 執行個體名.類屬性 來改變類屬性,該執行個體的該類屬性會變為執行個體屬性,而不影響其他執行個體的類屬性,以後通過 類名.類屬性 來更改類屬性,也不會影響到該執行個體的這個屬性了,因為它變為執行個體屬性啦。
Python 類屬性與執行個體屬性的關聯