python 類屬性和例項屬性名字衝突問題

2022-03-02 12:14:23 字數 1807 閱讀 4731

修改類屬性會導致所有例項訪問到的類屬性全部都受影響,但是,如果在例項變數上修改類屬性會發生什麼問題呢?

class

person(object):

address = '

earth

'def

__init__

(self, name):

self.name =name

p1 = person('

bob'

)p2 = person('

alice')

print

'person.address =

' +person.address

p1.address = '

china

'print

'p1.address =

' +p1.address

print

'person.address =

' +person.address

print

'p2.address =

' + p2.address

結果如下:

person.address = earth

p1.address = china

person.address = earth

p2.address = earth

我們發現,在設定了 p1.address = 'china' 後,p1訪問 address 確實變成了 'china',但是,person.address和p2.address仍然是'earch',怎麼回事?

原因是 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'了:

del

p1.address

print

p1.address

#=> earth

可見,千萬不要在例項上修改類屬性,它實際上並沒有修改類屬性,而是給例項繫結了乙個例項屬性。

請把上節的 person 類屬性 count 改為 __count,再試試能否從例項和類訪問該屬性。

class

person(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

')

1

2attributeerror

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和類...