可以看到,屬性可以分為類屬性和實(shí)例屬性,那么問(wèn)題就來(lái)了,如果類屬性和實(shí)例屬性名字相同時(shí),會(huì)怎么樣,這就涉及Python中類屬性和實(shí)例屬性的優(yōu)先級(jí)的問(wèn)題了。
我們可以做一個(gè)實(shí)驗(yàn),在前面類定義的基礎(chǔ)上,在實(shí)例屬性中,也初始化一個(gè)localtion的屬性。
?class Animal(object): localtion = 'Asia' def __init__(self, name, age, localtion): self.name = name self.age = age self.localtion = localtion
接著我們初始化兩個(gè)實(shí)例,并把localtion打印出來(lái)。
?dog = Animal('wangwang', 1, 'GuangDong') cat = Animal('mimi', 3, 'ChongQing') print(dog.localtion) # ==> GuangDong print(cat.localtion) # ==> ChongQing print(Animal.localtion) # ==> Asia
可見(jiàn),在類屬性和實(shí)例屬性同時(shí)存在的情況下,實(shí)例屬性的優(yōu)先級(jí)是要高于類屬性的,在操作實(shí)例的時(shí)候,優(yōu)先是操作實(shí)例的屬性。
另外,當(dāng)實(shí)例沒(méi)有和類同名的時(shí)候,通過(guò)實(shí)例對(duì)象,依然可以訪問(wèn)到類屬性。
class Animal(object): localtion = 'Asia' def __init__(self, name, age): self.name = name self.age = age cat = Animal('mimi', 3) print(cat.localtion) # ==> Asia
那通過(guò)實(shí)例,可不可以修改類屬性呢?我們來(lái)嘗試一下:
cat.localtion = 'Africa' print(Animal.localtion) # ==> Asia
這里依然打印了Asia,可見(jiàn)通過(guò)實(shí)例是無(wú)法修改類的屬性的,事實(shí)上,通過(guò)實(shí)例方法修改類屬性,只是給實(shí)例綁定了一個(gè)對(duì)應(yīng)的實(shí)例屬性:
?# 新增的實(shí)例屬性 print(cat.localtion) # ==> Africa
因此,需要特別注意,盡量不要通過(guò)實(shí)例來(lái)修改類屬性,否則很容易引發(fā)意想不到的錯(cuò)誤。
請(qǐng)把上節(jié)的 Animal類屬性 count 改為 __count,再試試能否從實(shí)例和類訪問(wèn)該屬性。
把count改為私有__count,這樣實(shí)例變量在外部無(wú)法修改__count
參考代碼:
class Animal(object): __count = 0 def __init__(self, name): Animal.__count = Animal.__count + 1 self.name = name print(Animal.__count) p1 = Animal('Cat') p2 = Animal('Dog') print(Animal.__count)
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過(guò)多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開(kāi)微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)