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