Python中的旧样式和新样式类有什么区别?

2022-09-05 01:09:08

Python中的旧样式和新样式类有什么区别?我什么时候应该使用其中一个?


答案 1

来自新式和经典课程

在Python 2.1之前,旧式类是用户唯一可用的版本。

(旧式)类的概念与类型的概念无关:如果 是旧式类的实例,则指定 的类,但始终是 。xx.__class__xtype(x)<type 'instance'>

这反映了这样一个事实,即所有旧式实例(独立于其类)都是使用单个内置类型(称为 instance)实现的。

Python 2.2 中引入了新样式的类,以统一类和类型的概念。新样式的类只是一个用户定义的类型,不多也不少。

如果 x 是新样式类的实例,则通常与 相同(尽管不能保证这一点 - 允许新样式类实例覆盖 返回的值 )。type(x)x.__class__x.__class__

引入新样式类的主要动机是提供具有完整元模型的统一对象模型

它还具有许多直接的好处,例如能够对大多数内置类型进行子类化,或者引入“描述符”,从而实现计算属性。

出于兼容性原因,默认情况下,类仍然是旧式的

通过将另一个新样式类(即类型)指定为父类,或者如果不需要其他父类,则指定“顶级类型”对象来创建新样式类。

除了返回的类型之外,新式类的行为在许多重要细节上与旧式类的行为不同。

其中一些更改是新对象模型的基础,例如调用特殊方法的方式。其他是以前因兼容性问题而无法实现的“修复”,例如多重继承情况下的方法解析顺序。

Python 3只有新式的类

无论你是否从中子类,类在Python 3中都是新式的。object


答案 2

声明方面:

新样式类继承自对象或其他新样式类。

class NewStyleClass(object):
    pass

class AnotherNewStyleClass(NewStyleClass):
    pass

旧式课程则不然。

class OldStyleClass():
    pass

Python 3 注意:

Python 3 不支持旧样式的类,因此上面提到的任何一种形式都会导致新样式的类。