为什么“类型”没有出现在新样式类的mro中?你知道吗
在下面的代码中,“type”是类“A”的元类,这意味着“type”“type”应该是“A”的方法解析顺序的一部分。为什么?
对于新样式类,我们为什么要继承“object”,为什么不继承“type”?
A.__class__
是“type”,但它不是mro的一部分。
请告诉我“object”和“type”的区别,实际上“type”从定义上也继承了“object”。我指的是“对象”和元类之间的区别。
同样在旧式类中,“classobj”是元类吗?
示例:
>>> class A(object):pass
...
>>>
>>> A.__mro__
(<class '__main__.A'>, <type 'object'>)
>>>
>>> A.__class__
<type 'type'>
type
是“types”从中继承的“type”。任何定义的类型都是type
,因此isinstance(x, type)
对于任何x
类型都有效。–困惑了吗?^^你知道吗当你实例化一个类型时,你会得到一个该类型的对象。这个对象不一定是类型;除非类型是元类,因为元类的实例是类型(这里我将忽略)。你知道吗
A
是一个类型。类型继承自type
(根据定义),通常情况下,类型的元类也是type
。type
的实例是类型,因此type
将包含在类型实例A
的方法解析顺序中。这就是调用A.mro()
的原因。mro()
是在type
上定义的,并且在创建类型实例A
时继承该方法。你知道吗但是请注意,^{} 为
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
的信息,请参见this answer。对于旧式类,
classobj
是元类的一种。请注意,旧样式的类有一个非常不同的对象模型,因此您只能在那里应用部分新样式。您现在应该尝试只使用新样式的类(甚至可能切换到python3),因为对象模型更加一致,而且在我看来更容易推理。相关问题 更多 >
编程相关推荐