为什么 "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'>
根据我的理解,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'>