为什么“类型”没有出现在新样式类的mro中?

2024-05-31 23:22:55 发布

您现在位置:Python中文网/ 问答频道 /正文

为什么“类型”没有出现在新样式类的mro中?你知道吗

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

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

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

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

  5. 同样在旧式类中,“classobj”是元类吗?

示例:

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

Tags: 对象方法代码示例类型定义object顺序
1条回答
网友
1楼 · 发布于 2024-05-31 23:22:55

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

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

  1. A是一个类型。类型继承自type(根据定义),通常情况下,类型的元类也是typetype的实例是类型,因此type将包含在类型实例A的方法解析顺序中。这就是调用A.mro()的原因。mro()是在type上定义的,并且在创建类型实例A时继承该方法。你知道吗

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

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

  3. A.__class__提供用于创建实例A类型。如果执行A().__class__,则会得到A,这是用于创建实例A()的类型。

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

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

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

相关问题 更多 >