为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 585 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信