dict_items类继承显示异常:为何issubclass与__mro__结果矛盾?
关于dict_items与collections.abc.ItemsView的继承疑问解析
我在查看Stack Overflow的一篇回答时发现,<class 'dict_items'>是<class 'collections.abc.ItemsView'>的子类,可通过以下代码验证:
>>> import collections >>> issubclass({}.items().__class__, collections.abc.ItemsView) True
但我查看dict_items类的__mro__属性时,并未发现collections.abc.ItemsView,结果为:
>>> {}.items().__class__.__mro__ (<class 'dict_items'>, <class 'object'>)
同时,查看collections.abc.ItemsView的子类列表,仅返回[<class 'collections._OrderedDictItemsView'>]。想请教为何会出现这种矛盾情况?
这是因为Python的**抽象基类(ABC)**采用了「虚拟子类」机制,而非传统的继承关系:
collections.abc.ItemsView是抽象基类,它通过register()方法把dict_items注册为自己的虚拟子类。这种注册不需要修改dict_items的继承链,所以__mro__里看不到ItemsView的身影。issubclass()和isinstance()这类内置函数会识别虚拟子类关系,所以会返回True,但虚拟子类不会出现在基类的__subclasses__()结果里,也不会进入目标类的方法解析顺序(MRO)。- 这种设计是为了让内置类型(比如
dict_items这种由C实现的底层类)无需修改自身结构,就能适配抽象基类定义的接口规范,同时保持底层实现的高效性。
内容的提问来源于stack exchange,提问作者gitartha
相关产品推荐
相关产品推荐

