为什么从对象继承会在Python中产生影响?

pro*_*eek 5 python inheritance object

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

>>> class A(): pass;
>>> a = A()
>>> type(a)
<type 'instance'>
>>> type(a) is A
False
>>> type(A)
<type 'classobj'>
Run Code Online (Sandbox Code Playgroud)

但是,当我从对象继承相同的类时,创建的对象是A的类型.

>>> class A(object): pass;
>>> a = A()
>>> type(a)
<class '__main__.A'>
>>> type(a) is A
True
>>> type(A)
<type 'type'>
Run Code Online (Sandbox Code Playgroud)

这背后的逻辑是什么?这是否意味着每个类都应该从对象继承

ars*_*jii 7

在Python 3中,这两个是相同的.但是,在Python 2中:

class A: pass  # old-style class

class B(object): pass  # new-style class
Run Code Online (Sandbox Code Playgroud)

从文档中的新风格和经典类:

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

Python 2.2中引入了新式类来统一类和类型.新式类既不是用户定义的类型,也不是用户定义的类型.如果x是新式类的实例,则type(x)与之相同x.__class__.

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

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