亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

python基本數據結構dict繼承自object,但為什么又是MutableMapping的子類

python基本數據結構dict繼承自object,但為什么又是MutableMapping的子類

躍然一笑 2018-12-16 17:20:40
dict是抽象類MutableMapping的一個子類>>> from collections.abc import MutableMapping>>> isinstance(dict(),MutableMapping)True但是在builtin.py中可以看到dict是繼承自object對象。所以我就產生了疑問,dict到底是如何實現繼承MutableMapping的呢,是直接繼承還是有一些中間環節。MutableMapping是繼承object的嗎,這三者之間的關系到底是怎樣的。我了解到dict的實現應當是由解釋器內部實現的。我知道這大概涉及到python解釋器的內部原理了,我對此很感興趣。MutableMapping也是由解釋器內部實現的嗎?然后dict和MutableMapping在解釋器內部實現了繼承關系
查看完整描述

1 回答

?
慕姐4208626

TA貢獻1852條經驗 獲得超7個贊

isinstance 除了會依據類的 mro 來判斷,也會基于 鴨子協議 來判斷對象是否滿足某個類型的行為。比如 list 對象是直接繼承自 object 。但它本身也能夠跌倒,它屬于可迭代對象。通過 isinstance([], typing.Iterable) 返回的是真。這部分和 __instancecheck__ 魔術方法有關,根據 PEP 3119 的描述中得知實例的檢查是允許重載的。

The primary mechanism proposed here is to allow overloading the built-in functions isinstance() and issubclass(). The overloading works as follows: The call isinstance(x, C) first checks whether C.__instancecheck__ exists, and if so, calls C.__instancecheck__(x) instead of its normal implementation. Similarly, the call issubclass(D, C) first checks whether C.__subclasscheck__ exists, and if so, calls C.__subclasscheck__(D) instead of its normal implementation.

大致意思是調用 isinstance(x,C) 時先檢查 C.__ instancecheck__ 是否存在,如果存在,則調用 C.__ instancecheck __(x)而不是其正常實現(從類的 mro 來判斷)。

MutableMapping 應該也是通過重載的方式實現了對"子類"的判斷。

相關文章:深度剖析isinstance的檢查機制


查看完整回答
反對 回復 2018-12-16
  • 1 回答
  • 0 關注
  • 629 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號