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

为什么从对象继承会在Python中产生影响?,python,object,inheritance,Python,Object,Inheritance,当类从零继承时,我有一个实例类型的对象 >>> class A(): pass; >>> a = A() >>> type(a) <type 'instance'> >>> type(a) is A False >>> type(A) <type 'classobj'> >A类():通过; >>>a=a() >>>类型(a) >>>类型(a)是一种 假的 >>>类型(A) 但是,

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

>>> class A(): pass;
>>> a = A()
>>> type(a)
<type 'instance'>
>>> type(a) is A
False
>>> type(A)
<type 'classobj'>
>A类():通过;
>>>a=a()
>>>类型(a)
>>>类型(a)是一种
假的
>>>类型(A)
但是,当我从一个对象继承同一个类时,创建的对象的类型是A

>>> class A(object): pass;
>>> a = A()
>>> type(a)
<class '__main__.A'>
>>> type(a) is A
True
>>> type(A)
<type 'type'>
>>A类(对象):通过;
>>>a=a()
>>>类型(a)
>>>类型(a)是一种
真的
>>>类型(A)

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

这解释了
实例的问题:

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

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

,这两者是相同的。但是,在Python 2中:

class A: pass  # old-style class

class B(object): pass  # new-style class
从文档中的:

直到Python2.1,旧式类是用户可用的唯一风格。(旧式)类的概念与类型的概念无关:如果
x
是旧式类的一个实例,那么
x.\uu class\uuu
指定
x
的类,但是
类型(x)
总是
。这反映了一个事实,即所有旧式实例(独立于它们的类)都是用一个名为instance的内置类型实现的

Python2.2中引入了新的样式类来统一类和类型。新样式的类既不多于也不少于用户定义的类型如果
x
是一个新样式类的实例,那么
type(x)
x相同

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


出于这些原因,尽可能使用新样式的类是一个好主意。Python2.2+中甚至存在老式类的唯一原因是为了向后兼容;在Python3中,旧样式的类被删除。

Python中用户定义类的原始实现被破坏了。2.2修复了它,但是为了向后兼容,他们必须保留旧系统。因此,Python有两种类型的类,“经典”和“新式”。从
对象继承的任何东西(直接或间接地)都是新型的;任何不符合标准的都是经典。您编写的每个类都应该以某种方式从对象继承,如果它没有任何其他父类,可以直接继承,也可以间接继承,因为它是从另一个新样式类(或内置类型)继承的


请看

好答案。我打算建议添加一些类似于“使用旧式类的唯一原因是当您调用某个古老的库时,它要求您为它提供
实例
s”,但您上一次的编辑很好地涵盖了这一点。同样密切相关的还有: