dict是抽象类MutableMapping的一个子类>>>fromcollections.abcimportMutableMapping>>>isinstance(dict(),MutableMapping)True但是在builtin.py中可以看到dict是继承自object对象。所以我就产生了疑问,dict到底是如何实现继承MutableMapping的呢,是直接继承还是有一些中间环节。MutableMapping是继承object的吗,这三者之间的关系到底是怎样的。我了解到dict的实现应当是由解释器内部实现的。我知道这大概涉及到python解释器的内部原理了,我对此很感兴趣。MutableMapping也是由解释器内部实现的吗?然后dict和MutableMapping在解释器内部实现了继承关系
2 回答
潇湘沐
TA贡献1816条经验 获得超6个赞
isinstance除了会依据类的mro来判断,也会基于鸭子协议来判断对象是否满足某个类型的行为。比如list对象是直接继承自object。但它本身也能够跌倒,它属于可迭代对象。通过isinstance([],typing.Iterable)返回的是真。这部分和__instancecheck__魔术方法有关,根据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.大致意思是调用isinstance(x,C)时先检查C.__instancecheck__是否存在,如果存在,则调用C.__instancecheck__(x)而不是其正常实现(从类的mro来判断)。MutableMapping应该也是通过重载的方式实现了对"子类"的判断。相关文章:深度剖析isinstance的检查机制
明月笑刀无情
TA贡献1828条经验 获得超4个赞
因为python内置的dict类实际上没有继承MutableMapping类,C语言编写的内置类型怎么可能继承自python语言编写的抽象基类呢?检查下dict类的MRO方法解析列表,它的“真实”基类们就一清二楚了:>>>dict.__mro__(, ) 那么为何通过函数检查dict,python又会告诉你“dict是MutableMapping的子类”呢?>>>importcollections>>>issubclass(dict,collections.abc.MutableMapping)True因为python的抽象基类能够【注册虚拟子类】:在你importcollections包时,该包的代码就已经执行了MutableMapping.register()方法,将dict注册为了自己的虚拟子类,从而可以通过函数检查。想从python代码的角度研究dict的行为及其继承关系?没问题,官方提供了python代码版本的dict类,即UserDict类,专供程序员继承/改造自定义的映射类型。>>>fromcollectionsimportUserDict>>>UserDict.__mro__(, , , , , , , )
添加回答
举报
0/150
提交
取消
