当类从无继承时,我有一个实例类型的对象。
>>> class A(): pass;
>>> a = A()
>>> type(a)
<type 'instance'>
>>> type(a) is A
False
>>> type(A)
<type 'classobj'>
但是,当我有从一个对象继承的相同类时,创建的对象是 A 的类型。
>>> class A(object): pass;
>>> a = A()
>>> type(a)
<class '__main__.A'>
>>> type(a) is A
True
>>> type(A)
<type 'type'>
这背后的逻辑是什么?意思是不是每个类都应该继承自object?
在 Python 3 中,这两者是相同的。然而,在 Python 2 中:
class A: pass # old-style class
class B(object): pass # new-style class
From 新式与经典课程 http://docs.python.org/2/reference/datamodel.html#new-style-and-classic-classes在文档中:
直到 Python 2.1,旧式类是用户可用的唯一风格。 (旧式)类的概念与类型的概念无关:if x
是旧式类的一个实例,那么x.__class__
指定类别x
, but type(x)
总是<type 'instance'>
。这反映了这样一个事实:所有旧式实例(与其类无关)都是使用单个内置类型(称为实例)实现的。
Python 2.2 中引入了新样式的类来统一类和类型。新样式类既不大于也不小于用户定义的类型。If x
是一个新式类的实例,那么type(x)
是相同的x.__class__
.
引入新式类的主要动机是提供具有完整元模型的统一对象模型。它还具有许多直接的好处,例如能够对大多数内置类型进行子类化,或者引入启用计算属性的“描述符”。
由于这些原因,尽可能使用新样式的类是一个好主意。 Python 2.2+ 中存在旧式类的唯一原因是为了向后兼容;在 Python 3 中,旧式类被删除。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)