類屬性和例項屬性名字衝突怎麼辦修改類屬性會導致所有例項訪問到的類屬性全部都受影響,但是,如果在例項變數上修改類屬性會發生什麼問題呢?
class
person(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
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
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...