为什么 "type" 不在 "int" 的 MRO 中?

Why isn't "type" in the MRO of "int"?

根据我的理解,int.mro() 的第二个元素应该是 <class 'type'>,因为那是 int.__class__ 的输出。但是 int.mro() 给出 [<class 'int'>, <class 'object'>]。它是如何实现的?

查看 int.mro() 向您展示了 int class 的继承树,而不是创建 [=13] 的 type 元 class =] class,因此 <class 'type'> 不应该在 int.mro() 中。当 metaclass 创建 class 对象时,它还会构建 __mro__.

相反,__class__是对实例类型的引用,向您显示class实例所属的class .这样的话,int所属的class就是metaclasstype。正是出于这个原因,对于大多数用例,x.__class__type(x) 相同。

您可以在以下示例中看到它们之间的关系:

print(int.__class__)
> <class 'type'>

print(int.mro())
> [<class 'int'>, <class 'object'>]

print(int.__class__.__mro__)
> [<class 'type'>, <class 'object'>]

print(int().__class__)
> <class 'int'>

此外,您可以在最简单的 class 示例中看到这种关系,您可以构造:

class A:
    pass

obj = A()
   
print(A.mro())
> [<class '__main__.A'>, <class 'object'>]

print(A.__class__)
> <class 'type'>