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'> |
- A.__class__.__mro__不包括type和任何元类;A.__mro__为A的实例提供解析命令。
type是"类型"继承自的"类型"。任何定义的类型都是一个type,因此isinstance(x, type)对作为类型的任何x都有效。–困惑了吗?^ ^
当您实例化一个类型时,您会得到该类型的对象。该对象不一定是一个类型;除非该类型是一个元类,因为元类的实例是类型(这里我将忽略)。
A是一种类型。类型继承自type(根据定义),在常见情况下,类型的元类也是type。type的实例是类型,因此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是可以实例化以创建对象的类型类型。
有关为什么object是type和为什么type反过来是object的信息,请参阅此答案。
对于旧式类,classobj是一种元类。请注意,旧样式类有一个非常不同的对象模型,因此您只能在那里应用部分新样式思想。现在您应该只使用新样式的类(甚至可能切换到python3),因为对象模型更加一致,在我看来更容易理解。