【发布时间】:2020-08-25 05:56:22
【问题描述】:
根据我的理解,int.mro() 的第二个元素应该是<class 'type'>,因为那是int.__class__ 的输出。但是int.mro() 却给出了[<class 'int'>, <class 'object'>]。它是如何实现的?
【问题讨论】:
标签: python python-3.x metaprogramming
根据我的理解,int.mro() 的第二个元素应该是<class 'type'>,因为那是int.__class__ 的输出。但是int.mro() 却给出了[<class 'int'>, <class 'object'>]。它是如何实现的?
【问题讨论】:
标签: python python-3.x metaprogramming
查看int.mro() 会显示int 类的继承树,而不是创建int 类的type 元类,因此为什么<class 'type'> 不应该在int.mro() 中。当元类创建类对象时,它也构建了__mro__。
相反,__class__ 是对实例的type 的引用,向您显示类实例所属的类。在这种情况下,int 所属的类是元类type。正是由于这个原因,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 A:
pass
obj = A()
print(A.mro())
> [<class '__main__.A'>, <class 'object'>]
print(A.__class__)
> <class 'type'>
【讨论】: