【问题标题】:Why isn't "type" in the MRO of "int"?为什么“int”的MRO中没有“type”?
【发布时间】:2020-08-25 05:56:22
【问题描述】:

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

【问题讨论】:

    标签: python python-3.x metaprogramming


    【解决方案1】:

    查看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'>
    

    【讨论】:

      猜你喜欢
      • 2018-09-10
      • 1970-01-01
      • 2016-05-23
      • 2023-04-10
      • 2014-08-12
      • 2010-10-20
      • 2011-01-24
      • 2016-03-25
      • 1970-01-01
      相关资源
      最近更新 更多