【问题标题】:Why is "type" not present in mro of new style class?为什么新样式类的mro中没有“类型”?
【发布时间】:2018-09-10 19:24:26
【问题描述】:

为什么新样式类的mro中没有“type”?

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

  2. 对于新样式类,为什么我们继承“object”,为什么不继承“type”?

  3. A.__class__ 是“类型”,但它不是 mro 的一部分。

  4. 请告诉我“object”和“type”的区别,实际上“type”也继承了“object”的定义。我的意思是“对象”和元类之间的区别。

  5. 在旧式类中,“classobj”也是一个元类?

例子:

>>> class A(object):pass
...
>>>
>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>>
>>> A.__class__
<type 'type'>

【问题讨论】:

  • A.__class__.__mro__ 确实包括type(和任何元类); A.__mro__ 为您提供Ainstances 的解析顺序。

标签: python python-2.7


【解决方案1】:

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

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

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

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

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

  3. A.__class__ 为您提供用于创建实例A类型。如果您执行A().__class__,您将获得A,这是用于创建实例A() 的类型。

  4. object 是 Python 中 any 对象的 基本类型。一切都是对象,所以任何对象都是object 的直接或间接实例。 type 是可以实例化创建对象的类型类型。

    有关为什么objecttype,以及为什么type 又是object 的信息,请参阅this answer

  5. 对于老式类,classobj 是一种元类。请注意,旧式类具有非常不同的对象模型,因此您只能在其中应用部分新式思维方式。您现在应该尝试只使用新样式的类(或者甚至可能切换到 Python 3),因为对象模型更加一致并且在我看来更容易推理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2016-04-16
    • 2014-12-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-23
    相关资源
    最近更新 更多