Python類和實(shí)例的屬性機(jī)制原理詳解
實(shí)例是具象化的類,它可以作為類訪問所有靜態(tài)綁定到類上的屬性,包括類變量與方法,也可以作為實(shí)例訪問動(dòng)態(tài)綁定到實(shí)例上的屬性。
實(shí)例1:
class A:
work = list("hello")
kind = list("world")
another = 1
def test1(self):
print(self.work, self.kind, self.another)
self.work[0], self.kind [0] = "t", "t"
self.another += 1
print(A.work, A.kind, A.another)
if __name__ == "__main__":
a = A()
a.test1()
輸出結(jié)果:
['h', 'e', 'l', 'l', 'o'] ['w', 'o', 'r', 'l', 'd'] 1
['t', 'e', 'l', 'l', 'o'] ['t', 'o', 'r', 'l', 'd'] 1
test1中演示了實(shí)例對類變量的訪問與修改,從輸出結(jié)果可以看到,類變量work和kind的列表被修改了,而another的值沒有發(fā)生變化,說明如果類變量是可變的,那么可以通過實(shí)例來對類變量進(jìn)行修改,如果類變量不可變,那么實(shí)例無法修改類變量。
實(shí)例2:
class A:
work = list("hello")
kind = list("world")
another = 1
def test2(self):
A.work, A.kind = "hello", " world"
A.another += 2
print(self.__dict__)
print(self.work, self.kind, self.another)
A.test2 = 13
print(self.test2)
if __name__ == "__main__":
a = A()
a.test2()
輸出結(jié)果:
{'another': 2}
hello world 2
13
test2說明了實(shí)例訪問類變量與方法的機(jī)制,在test1中,已經(jīng)給實(shí)例動(dòng)態(tài)綁定了一個(gè)another的屬性,值為2(因?yàn)橛匈x值語句)。在self.__dict__中可以看到確實(shí)出現(xiàn)了實(shí)例屬性another。
在使用實(shí)例訪問屬性(變量與方法)時(shí),如果在實(shí)例的屬性集里沒有找到對應(yīng)的屬性,那么就會(huì)到類的屬性集里找對應(yīng)的屬性。self.work和self.kind和類變量保持一致,說明并沒有事先在實(shí)例與類變量之間建立引用,而是動(dòng)態(tài)查找的。
class A:
work = list("hello")
kind = list("world")
another = 1
def test3(self):
print(self.__dict__)
self.w, self.k = 0, 1
print(self.__dict__)
self.work, self.kind = 4, 4
print(self.__dict__)
self.test1 = 12
print(self.__dict__)
try:
self.test1()
except:
print("test1 is not a bound method")
if __name__ == "__main__":
a = A()
a.test3()
輸出結(jié)果:
{'another': 2}
{'another': 2, 'w': 0, 'k': 1}
{'another': 2, 'w': 0, 'k': 1, 'work': 4, 'kind': 4}
{'another': 2, 'w': 0, 'k': 1, 'work': 4, 'kind': 4, 'test1': 12}
test1 is not a bound method
self.__dict__中保存了動(dòng)態(tài)綁定到實(shí)例的變量與方法,只要出現(xiàn)了賦值語句,都是動(dòng)態(tài)綁定屬性。如果動(dòng)態(tài)綁定的屬性與類的變量或方法同名,在查找過程中就會(huì)覆蓋類的變量和方法。
總結(jié)
1. 動(dòng)態(tài)綁定到實(shí)例的屬性位于self.__dict__中
2. 出現(xiàn)self.attribute = XXX之類的賦值語句都是在往實(shí)例上動(dòng)態(tài)綁定屬性
3. 實(shí)例查找屬性的流程:self.work -> self.__dict__["work"] or cls.work,這是一個(gè)動(dòng)態(tài)的過程,實(shí)例中的同名屬性會(huì)覆蓋類變量或方法,類變量或方法的修改會(huì)實(shí)時(shí)影響實(shí)例查找屬性的結(jié)果
4. 如果類變量是可修改的,如列表,字典等,可以通過實(shí)例來修改類變量,方法是不可修改的,故無法通過實(shí)例修改方法
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)將一個(gè)正整數(shù)分解質(zhì)因數(shù)的方法分析
這篇文章主要介紹了Python實(shí)現(xiàn)將一個(gè)正整數(shù)分解質(zhì)因數(shù)的方法,結(jié)合實(shí)例形式對比分析了Python計(jì)算正整數(shù)分解質(zhì)因數(shù)的算法逐步改進(jìn)操作技巧,需要的朋友可以參考下2017-12-12
Python基于gevent實(shí)現(xiàn)文件字符串查找器
這篇文章主要介紹了Python基于gevent實(shí)現(xiàn)文件字符串查找器,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-08-08
Python re.sub 反向引用的實(shí)現(xiàn)
反向引用指的是在指定替換結(jié)果的過程中,可以引用原始字符串中的匹配到內(nèi)容,本文主要介紹了反向引用的設(shè)置方法,感興趣的可以了解一下2021-07-07
python中playwright結(jié)合pytest執(zhí)行用例的實(shí)現(xiàn)
本文主要介紹了python中playwright結(jié)合pytest執(zhí)行用例的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-12-12
寫了個(gè)監(jiān)控nginx進(jìn)程的Python腳本
接上一文用iptables讓SSH服務(wù)對陌生人說不。還是有點(diǎn)擔(dān)心這個(gè)學(xué)期內(nèi),nginx可能會(huì)因?yàn)橄到y(tǒng)各種原因而出現(xiàn)異常退出,導(dǎo)致Web服務(wù)暫停。所以,又來了一個(gè)方案2012-05-05
詳解Python prometheus_client使用方式
本文主要介紹了Python prometheus_client使用方式,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02
Python語言的12個(gè)基礎(chǔ)知識點(diǎn)小結(jié)
這篇文章主要介紹了Python語言的12個(gè)基礎(chǔ)知識點(diǎn)小結(jié),包含正則表達(dá)式替換、遍歷目錄方法、列表按列排序、去重、字典排序等,需要的朋友可以參考下2014-07-07

