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 回答
![?](http://img1.sycdn.imooc.com/54586453000163bd02200220-100-100.jpg)
慕姐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
提交
取消