淺談python 中類屬性共享的問(wèn)題
感覺(jué)這種理解有問(wèn)題,舉個(gè)例子來(lái)說(shuō)。
class Dog(object):
name = 'dog'
def init(self):
self.age = 18
d1 = Dog()
d2 = Dog()
這里有兩個(gè)實(shí)例 d1,d2 吧。
d1.name # 輸出 dogd2.name # 輸出 dogd1.name = 'abc' d1.name # 輸出 abcd2.name # 輸出 dogDog.name # 輸出 dog
原因是 d1.name 輸出 dog 不是因?yàn)檫@個(gè)實(shí)例共享了類屬性,而是因?yàn)檫@個(gè)實(shí)例沒(méi)有 dog 屬性,所以 python 查找了類屬性。但是一旦你修改了 d1.name 相當(dāng)于給 d1 實(shí)例綁定了 name 屬性之后,d1.name 就與類屬性無(wú)關(guān)了。既然這樣就談不上實(shí)例之間共享類屬性了,因?yàn)橹灰毁x值,就相當(dāng)于綁定了屬性,則上述 d1.name 的含義和 d2.name 的含義就不同了,它們的值也不同,很明顯它們的數(shù)據(jù)沒(méi)有共享。
但是要修改類屬性,應(yīng)該用
Dog.name = 'new name'
而不應(yīng)該是
dog1.name = 'new name'
因?yàn)閷?shí)例屬性同名而覆蓋類屬性,的確是一個(gè)很容易忽視、出錯(cuò)的地方。
>>> class Dog(): ... name = "dog" ... >>> d1 = Dog() >>> d1.name 'dog' >>> d2 = Dog() >>> d2.name 'dog' >>> Dog.name 'dog' >>> Dog.name = "a" >>> d.name Traceback (most recent call last): File "<stdin>", line 1, in <module> NameError: name 'd' is not defined >>> d1.name 'a' >>> d2.name 'a' >>>
以上這篇淺談python 中類屬性共享的問(wèn)題就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python編程使用有限狀態(tài)機(jī)識(shí)別地址有效性
這篇文章主要介紹了Python編程中如何使用有限狀態(tài)機(jī)識(shí)別地址有效性,如何識(shí)別一個(gè)地址是否有效,確切的講,如何編程識(shí)別一個(gè)中國(guó)地址是否有效2021-09-09
給Python中的MySQLdb模塊添加超時(shí)功能的教程
Pandas中如何對(duì)DataFrame列名進(jìn)行重命名
python打印n位數(shù)“水仙花數(shù)”(實(shí)例代碼)
一文帶你深入理解Python的`functools.lru_cache`裝飾器
機(jī)器學(xué)習(xí)實(shí)戰(zhàn)之knn算法pandas

