類屬性和例項屬性衝突

2022-02-27 17:45:53 字數 1494 閱讀 8480

類屬性和例項屬性名字衝突怎麼辦

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

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'了:

delp1.address

print

p1.address

#=> earth

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

任務請把上節的 person 類屬性 count 改為

__count,再試試能否從例項和類訪問該屬性。

例項屬性的優先順序高,遮蔽類屬性

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

修改類屬性會導致所有例項訪問到的類屬性全部都受影響,但是,如果在例項變數上修改類屬性會發生什麼問題呢?class person object address earth def init self,name self.name name p1 person bob p2 person alice p...

例項屬性和類屬性

例項屬性和類屬性 由於python是動態語言,根據類建立的例項可以任意繫結屬性。給例項繫結屬性的方法是通過例項變數,或者通過self變數 class student object def init self,name self.name name s student bob s.score 90但是...

類屬性和例項屬性

類屬性就是類物件所擁有的屬性,它被所有類物件的例項物件所共有,在記憶體中只存在乙個副本,這個和c 中類的靜態成員變數有點類似。對於公有的類屬性,在類外可以通過類物件和例項物件訪問 class people object name tom 公有的類屬性 age 12 私有的類屬性 p people p...