关于python:为什么新样式类的mro中不存在”type”?

Why is “type” not present in mro of new style class?

为什么"类型"没有出现在新样式类的MRO中?

  • 在下面的代码中,"type"是"a"类的元类,这意味着"type"应该是"a"方法解析顺序的一部分。为什么?

  • 对于新的样式类,为什么我们要继承"object",为什么不继承"type"?

  • A.__class__是"类型",但它不是MRO的一部分。

  • 请告诉我"对象"和"类型"的区别,实际上"类型"也从定义上继承了"对象"。我的意思是"对象"和元类之间的区别。

  • 在旧样式类中,"classobj"也是元类吗?

  • 例子:

    1
    2
    3
    4
    5
    6
    7
    8
    >>> class A(object):pass
    ...
    >>>
    >>> A.__mro__
    (<class '__main__.A'>, <type 'object'>)
    >>>
    >>> A.__class__
    <type 'type'>


    type是"类型"继承自的"类型"。任何定义的类型都是一个type,因此isinstance(x, type)对作为类型的任何x都有效。–困惑了吗?^ ^

    当您实例化一个类型时,您会得到该类型的对象。该对象不一定是一个类型;除非该类型是一个元类,因为元类的实例是类型(这里我将忽略)。

  • A是一种类型。类型继承自type(根据定义),在常见情况下,类型的元类也是typetype的实例是类型,因此type将包含在类型实例A的方法解析顺序中。这就是为什么打电话给A.mro()是有效的。mro()type上定义,当创建类型实例A时继承该方法。

    但是请注意,A.mro()A的实例提供了方法解析顺序。不适用于A本身(类型实例)。

  • 你继承object,因为在实例化A的对象时,该对象应该是instanceof(x, A)instanceof(x, object)。但它不是一个类型,因为这意味着您可以再次实例化它。它是一个对象,所以您应该从对象继承(直接或间接)。

  • A.__class__提供了用于创建实例A的类型。如果您执行A().__class__,您将得到A,它是用于创建实例A()的类型。

  • object是python中任何对象的基类型。一切都是一个对象,所以任何对象都是object的直接或间接实例。type是可以实例化以创建对象的类型类型。

    有关为什么objecttype和为什么type反过来是object的信息,请参阅此答案。

  • 对于旧式类,classobj是一种元类。请注意,旧样式类有一个非常不同的对象模型,因此您只能在那里应用部分新样式思想。现在您应该只使用新样式的类(甚至可能切换到python3),因为对象模型更加一致,在我看来更容易理解。