您好,登錄后才能下訂單哦!
本篇內(nèi)容介紹了“Python中__dict__有什么用”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
Python這門編程語(yǔ)言的最大的好處就是其語(yǔ)言的動(dòng)態(tài)性帶來(lái)編程的便利性,不像靜態(tài)語(yǔ)言那樣死板,比如它可以運(yùn)行期動(dòng)態(tài)添加類定義時(shí)沒(méi)有的屬性,例如:
class A: def __init__(self): self.name = 'zhang' def eat(self): print('eat') a = A() a.age = 10 print(a.age)
在Java中這段代碼可定是沒(méi)法通過(guò)編譯的,但在Python中這樣的操作不再是司空見(jiàn)慣的事情,那Python解釋器在背后究竟做了什么操作呢?答案是__dict__
,Python中的所有內(nèi)建(build-in)數(shù)據(jù)類型(type)都有屬性__dcit__
,當(dāng)然自定義的類(class)也有,因?yàn)樽远x的類也是一種數(shù)據(jù)類型嘛。在a.age=10
前后分別加上一行print a.__dict__
可以得到結(jié)果:
{'name': 'zhang'} {'age': 10, 'name': 'zhang'} 10
不難看出,在運(yùn)行期和類定義期所定義的實(shí)例對(duì)象屬性放在該對(duì)象的 __dict__
屬性中,接下來(lái)在a=A()
后面加上幾行代碼:
A.country = "China" print a.country print a.__dict__
得到結(jié)果:
China {'age': 10, 'name': 'zhang'}
對(duì)象a的__dict__
屬性中并沒(méi)'country'這個(gè)屬性,那它是哪來(lái)的呢?那么不妨打印類對(duì)象A的__dict__
看看:
print a.country print a.__dict__ print A.__dict__
輸出結(jié)果:
China {'age': 10, 'name': 'zhang'} {'country': 'China', '__module__': '__main__', 'eat': <function eat at 0x104e3b230>, ...省略}
這下應(yīng)該明白了,在運(yùn)行期間,定義的實(shí)例對(duì)象(a)的屬性是放在a.__dict__
中,而定義的類對(duì)象(A)的屬性是放在A.__dict__
中,那為什么實(shí)例對(duì)象a是怎么訪問(wèn)到country屬性的呢? Python中是這樣約定的,以obj.attr訪問(wèn)時(shí),它會(huì)按照如下順序去查找:
對(duì)象自身,obj.__dict__['attr']
對(duì)象類型,obj.__class__.__dict__['attr']
對(duì)象類型的基類,obj.__class__.__bases__中的所有__dict__['attr']
。注意,當(dāng)多重繼承的情況下有菱形繼承的時(shí)候,Python會(huì)根據(jù)MRO確定的順序進(jìn)行搜索。
如果在基類都還沒(méi)找到要訪問(wèn)的屬性時(shí),Python解釋器就會(huì)跑出一個(gè)異常:AttributeError。那么問(wèn)題來(lái)了,我們是否可以給內(nèi)建(build-in)類型添加一些自定義的屬性呢?比如:
list.myExtension = lambda self,x:x * 2 list.myExtension(10)
運(yùn)行的時(shí)候,解釋器會(huì)報(bào)錯(cuò):TypeError: can't set attributes of built-in/extension type 'list',那能否向list的__dict__
屬性中添加一個(gè)值呢?
list.__dict__['myExtension'] = lambda self, x:x * 2
還是一樣,沒(méi)法運(yùn)行:TypeError: 'dictproxy' object does not support item assignment,細(xì)細(xì)思來(lái),后者不能運(yùn)行也是符合情理的,兩者就是等價(jià)的東西,那為什么不允許程序員擴(kuò)展內(nèi)建類型呢?
后面那位睡覺(jué)的同學(xué)你來(lái)回答一下,答曰:Guido van Rossum老爹是用C語(yǔ)言來(lái)實(shí)現(xiàn)的這些類型,你是沒(méi)法再修改的,那如何優(yōu)雅地?cái)U(kuò)展已有類型呢?知道OOP的同學(xué)都會(huì)用繼承的方式來(lái)做。于是那位同學(xué)繼續(xù)睡覺(jué)去了。
“Python中__dict__有什么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。