修改類屬性會導致所有例項訪問到的類屬性全部都受影響,但是,如果在例項變數上修改類屬性會發生什麼問題呢?
classperson(object):
address = '
earth
'def
__init__
(self, name):
self.name =name
p1 = person('
bob'
)p2 = person('
alice')
'person.address =
' +person.address
p1.address = '
china
'p1.address =
' +p1.address
'person.address =
' +person.address
'p2.address =
' + p2.address
結果如下:
person.address = earth我們發現,在設定了 p1.address = 'china' 後,p1訪問 address 確實變成了 'china',但是,person.address和p2.address仍然是'earch',怎麼回事?p1.address = china
person.address = earth
p2.address = earth
原因是 p1.address = 'china'並沒有改變 person 的 address,而是給 p1這個例項繫結了例項屬性address ,對p1來說,它有乙個例項屬性address(值是'china'),而它所屬的類person也有乙個類屬性address,所以:
訪問 p1.address 時,優先查詢例項屬性,返回'china'。
訪問 p2.address 時,p2沒有例項屬性address,但是有類屬性address,因此返回'earth'。
可見,當例項屬性和類屬性重名時,例項屬性優先順序高,它將遮蔽掉對類屬性的訪問。
當我們把 p1 的 address 例項屬性刪除後,訪問 p1.address 就又返回類屬性的值 'earth'了:
delp1.address
p1.address
#=> earth
可見,千萬不要在例項上修改類屬性,它實際上並沒有修改類屬性,而是給例項繫結了乙個例項屬性。
請把上節的 person 類屬性 count 改為 __count,再試試能否從例項和類訪問該屬性。
classperson(object):
__count =0
def__init__
(self, name):
self.name =name
person.
__count = person.__count + 1
print(person.__count
)p1 = person('
bob'
)p2 = person('
alice')
try:
print(person.__count
)except
attributeerror:
print('
attributeerror
')
12attributeerror
Python 類屬性和例項屬性
一 簡述二者區別 對類屬性的修改可被儲存在類中 單例模式就是基於類屬性的這種特性 修改後的屬性能夠被子類繼承 例項屬性的修改只對該例項有效,不會對其他例項和其對應類的子類例項造成影響 二 來看下例子 類屬性 class a object a 1 pass print a.a 檢視a類的屬性a,結果為...
python 例項屬性和類屬性
如何在乙個類中定義一些常量,每個物件都可以方便訪問這些常量而不用重新構造?第乙個問題,在 python 的類裡,你只需要和函式並列地宣告並賦值,就可以實現這一點,例如這段 中的 welcome str。一種很常規的做法,是用全大寫來表示常量,因此我們可以在類中使用 self.welcome str ...
Python類屬性,例項屬性
dreamfor的部落格 1.python類資料屬性 定義在類裡面但在函式外面的變數,它們都是靜態的。一段很簡單的 但反應了很多 class a a 1 乙個類裡面有個屬性a a a b a a.a b.a a.a 這個屬效能被例項和類訪問 a.a 2 b.a a.a 改變例項a的屬性a,例項b和類...