乙個類例項化後,例項是乙個物件,有屬性。同樣,類也是乙個物件,它也有屬性。定義乙個類屬性,如下:
class a:
x = 7
定義乙個很簡單的類,類中有乙個變數x=7
,在類a中,變數x所引用的資料,能夠直接通過類來呼叫。或者說x是類a的屬性,這種屬性稱為類屬性。
class a:
x = 7
if __name__ == '__main__':
foo = a()
print(foo.x)
例項化,通過例項也可以得到這個屬性,這個屬性叫做「例項屬性」。
class a:
x = 7
if __name__ == '__main__':
foo = a()
print(foo.x)
foo.x += 1
print(foo.x)
print(a.x)
例項屬性更新了,類屬性沒有改變。這至少說明,類屬性不會被例項屬性左右,也可以進一步說「類屬性與例項屬性無關」。那麼foo.x+=1
的本質是什麼呢?其本質是該例項foo又建立了乙個新的屬性,但是這個屬性(新的foo.x)居然與原來的屬性(舊的foo.x)重名,所以,原來的foo.x就被「遮蓋了」,只是訪問到新的foo.x,它的值是8。
class a:
x = 7
if __name__ == '__main__':
foo = a()
print(foo.x)
foo.x += 1
del foo.x
print(foo.x)
既然新的foo.x「遮蓋」了舊的foo.x,如果刪除它,舊的不久就顯現出來了?的確是。刪除之後,foo.x就還是原來的值。例項屬性跟著類屬性而改變。
以上所言,是指當類中變數引用的是不可變資料。如果類中變數引用可變資料,情形會有所不同。因為可變資料能夠進行原地修改。
class b:
y = [1, 2, 3]
if __name__ == '__main__':
print(b.y)
bar = b()
print(bar.y)
print(bar.y)
print(b.y)
執行結果:
[1, 2, 3]
[1, 2, 3]
[1, 2, 3, 4]
[1, 2, 3, 4]
process finished with exit code 0
從上面的比較操作中可以看出,當類中變數引用的是可變物件時,類屬性和例項屬性都能直接修改這個物件,從而影響另一方的值。
類屬性不受例項屬性左右。在類確定或者例項化之後,也可以增加和修改屬性,其方法是通過類或者例項的點號操作來實現,即object.attribute
,可以實現對屬性的修改和增加。
總結例項屬性跟著類屬性而改變,類屬性不會被例項屬性左右。
當類中變數引用的是可變物件時,類屬性和例項屬性都能直接修改這個物件,從而影響另一方的值。
例項屬性屬於各個例項所有,互不干擾。
類屬性屬於類所有,所有例項共享乙個屬性。
在編寫程式的時候,千萬不要對例項屬性和類屬性使用相同的名字,因為相同名稱的例項屬性將遮蔽掉類屬性,但是當你刪除例項屬性後,再使用相同的名稱,訪問到的將是類屬性。
Python 類屬性和例項屬性
一 簡述二者區別 對類屬性的修改可被儲存在類中 單例模式就是基於類屬性的這種特性 修改後的屬性能夠被子類繼承 例項屬性的修改只對該例項有效,不會對其他例項和其對應類的子類例項造成影響 二 來看下例子 類屬性 class a object a 1 pass print a.a 檢視a類的屬性a,結果為...
python 例項屬性和類屬性
如何在乙個類中定義一些常量,每個物件都可以方便訪問這些常量而不用重新構造?第乙個問題,在 python 的類裡,你只需要和函式並列地宣告並賦值,就可以實現這一點,例如這段 中的 welcome str。一種很常規的做法,是用全大寫來表示常量,因此我們可以在類中使用 self.welcome str ...
python的類屬性和例項屬性
在處理專案的 的時候,發現如下 在多次呼叫的時候會出現問題。class test1 object dataarr def init self,i def run self print self.dataarr t1 test1 1 t2 test1 2 t1.run t2.run 輸出的結果照常理的...