为何Python内置类继承自ABC但元类是type而非ABCMeta?
为什么dict是Mapping的子类但元类是type?
核心原因在于Python抽象基类(ABC)的虚拟子类机制,和你推测的显式继承逻辑不一样:
- 内置类型如
dict、set并没有真正显式继承collections.abc里的抽象基类,而是被Python内部注册为这些ABC的虚拟子类。比如dict被注册为MutableMapping(其本身继承自Mapping)的虚拟子类,所以执行issubclass(dict, Mapping)会返回True。 - ABC的元类
ABCMeta重写了__subclasscheck__方法,这个方法会优先检查类是否在ABC的注册列表中,而不是只看类的显式继承链。这就解释了为什么你通过issubclass得到的结果看起来像是有继承关系,但实际不存在。 - 内置类型的元类是
type是正常情况,因为它们是Python解释器底层实现的原生类型,并非用ABCMeta定义的类。虚拟子类机制只是扩展了issubclass的判断规则,不会改变类本身的元类。
你可以通过查看dict的方法解析顺序(MRO)验证这一点:
>>> print(dict.__mro__) (<class 'dict'>, <class 'object'>)
从输出能看到,dict的继承链里根本没有Mapping或MutableMapping,进一步证明它是虚拟子类而非显式继承。
内容的提问来源于stack exchange,提问作者Jordan
相关产品推荐
相关产品推荐

