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的檢查機制
添加回答
舉報
0/150
提交
取消