溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Python中__dict__有什么用

發(fā)布時(shí)間:2021-12-17 15:12:43 來(lái)源:億速云 閱讀:142 作者:iii 欄目:大數(shù)據(jù)

本篇內(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ì)按照如下順序去查找:

  1. 對(duì)象自身,obj.__dict__['attr']

  2. 對(duì)象類型,obj.__class__.__dict__['attr']

  3. 對(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í)用文章!

向AI問(wèn)一下細(xì)節(jié)

免責(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)容。

AI