6

当类从无继承时,我有一个实例类型的对象。

>>> 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

4

3 回答 3

8

在 Python 3 中,这两者是相同的。然而,在 Python 2 中:

class A: pass  # old-style class

class B(object): pass  # new-style class

来自文档中的新式和经典类

直到 Python 2.1,旧式类是用户唯一可用的风格。(旧式)类的概念与类型的概念无关:如果x是旧式类的实例,则x.__class__指定 的类x,但type(x)始终是<type 'instance'>。这反映了一个事实,即所有旧式实例,独立于它们的类,都是用一个称为实例的内置类型实现的。

Python 2.2 中引入了新型类来统一类和类型。新式类既不多也不少于用户定义的类型。Ifx是新式类的实例,则type(x)x.__class__.

引入新型类的主要动机是提供具有完整元模型的统一对象模型。它还具有许多直接的好处,例如能够对大多数内置类型进行子类化,或者引入启用计算属性的“描述符”。

由于这些原因,尽可能使用新式类是个好主意。Python 2.2+ 中甚至存在老式类的唯一原因是为了向后兼容。在 Python 3 中,旧式类已被删除。

于 2013-08-20T22:19:34.600 回答
1

Python 中用户定义类的原始实现很糟糕。2.2 修复了它,但为了向后兼容,他们不得不保留旧系统。因此,Python 有 2 种类型的类,“经典”和“新风格”。任何继承自object(直接或间接)的东西都是新式的;没有的就是经典。您编写的每个类都应该以某种方式从 object 继承,如果它没有任何其他父级则直接继承,或者因为它从另一个新样式类(或内置类型)继承而间接继承。

http://python-history.blogspot.com/2010/06/new-style-classes.html

于 2013-08-20T22:21:16.033 回答
0

这解释了instance事情:

>>> class A(): pass;
>>> A
<class __main__.A at 0x7f879998b050>
>>> A()                                            
<__main__.A instance at 0x7f87999a83b0>

type()无论如何你不应该用来比较python中的对象,你应该使用isinstance()

于 2013-08-20T22:17:47.830 回答