第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

python基本數(shù)據(jù)結(jié)構(gòu)dict繼承自object,但為什么又是MutableMapping的子類

python基本數(shù)據(jù)結(jié)構(gòu)dict繼承自object,但為什么又是MutableMapping的子類

哆啦的時光機 2019-05-11 09:46:58
dict是抽象類MutableMapping的一個子類>>>fromcollections.abcimportMutableMapping>>>isinstance(dict(),MutableMapping)True但是在builtin.py中可以看到dict是繼承自object對象。所以我就產(chǎn)生了疑問,dict到底是如何實現(xiàn)繼承MutableMapping的呢,是直接繼承還是有一些中間環(huán)節(jié)。MutableMapping是繼承object的嗎,這三者之間的關(guān)系到底是怎樣的。我了解到dict的實現(xiàn)應(yīng)當是由解釋器內(nèi)部實現(xiàn)的。我知道這大概涉及到python解釋器的內(nèi)部原理了,我對此很感興趣。MutableMapping也是由解釋器內(nèi)部實現(xiàn)的嗎?然后dict和MutableMapping在解釋器內(nèi)部實現(xiàn)了繼承關(guān)系
查看完整描述

2 回答

?
瀟湘沐

TA貢獻1816條經(jīng)驗 獲得超6個贊

isinstance除了會依據(jù)類的mro來判斷,也會基于鴨子協(xié)議來判斷對象是否滿足某個類型的行為。比如list對象是直接繼承自object。但它本身也能夠跌倒,它屬于可迭代對象。通過isinstance([],typing.Iterable)返回的是真。這部分和__instancecheck__魔術(shù)方法有關(guān),根據(jù)PEP3119的描述中得知實例的檢查是允許重載的。
Theprimarymechanismproposedhereistoallowoverloadingthebuilt-infunctionsisinstance()andissubclass().Theoverloadingworksasfollows:Thecallisinstance(x,C)firstcheckswhetherC.__instancecheck__exists,andifso,callsC.__instancecheck__(x)insteadofitsnormalimplementation.Similarly,thecallissubclass(D,C)firstcheckswhetherC.__subclasscheck__exists,andifso,callsC.__subclasscheck__(D)insteadofitsnormalimplementation.
大致意思是調(diào)用isinstance(x,C)時先檢查C.__instancecheck__是否存在,如果存在,則調(diào)用C.__instancecheck__(x)而不是其正常實現(xiàn)(從類的mro來判斷)。
MutableMapping應(yīng)該也是通過重載的方式實現(xiàn)了對"子類"的判斷。
相關(guān)文章:深度剖析isinstance的檢查機制
                            
查看完整回答
反對 回復(fù) 2019-05-11
?
明月笑刀無情

TA貢獻1828條經(jīng)驗 獲得超4個贊

因為python內(nèi)置的dict類實際上沒有繼承MutableMapping類,C語言編寫的內(nèi)置類型怎么可能繼承自python語言編寫的抽象基類呢?檢查下dict類的MRO方法解析列表,它的“真實”基類們就一清二楚了:
>>>dict.__mro__
(,)
那么為何通過函數(shù)檢查dict,python又會告訴你“dict是MutableMapping的子類”呢?
>>>importcollections
>>>issubclass(dict,collections.abc.MutableMapping)
True
因為python的抽象基類能夠【注冊虛擬子類】:在你importcollections包時,該包的代碼就已經(jīng)執(zhí)行了MutableMapping.register()方法,將dict注冊為了自己的虛擬子類,從而可以通過函數(shù)檢查。
想從python代碼的角度研究dict的行為及其繼承關(guān)系?沒問題,官方提供了python代碼版本的dict類,即UserDict類,專供程序員繼承/改造自定義的映射類型。
>>>fromcollectionsimportUserDict
>>>UserDict.__mro__
(,,,,,,,)
                            
查看完整回答
反對 回復(fù) 2019-05-11
  • 2 回答
  • 0 關(guān)注
  • 1067 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號