Python中的旧样式类和新样式类有什么区别?我什么时候应该使用其中一种?
从 新式和经典类 :
直到 Python 2.1,旧式类是用户唯一可用的风格。 (旧式)类的概念与类型的概念无关:如果x是旧式类的实例,则x.__class__ 指定 的类x,但type(x)始终是<type 'instance'>。 这反映了一个事实,即所有老式实例,独立于它们的类,都是用一个称为实例的内置类型实现的。 Python 2.2 引入了新式类,以统一类和类型的概念 。新式类只是用户定义的类型,不多也不少。 如果 x 是新式类的实例,则type(x)通常与 相同x.__class__(尽管这不能保证——允许新式类实例覆盖为 的返回值x.__class__)。 引入新型类的主要动机是提供具有完整元模型的统一对象模型 。 它还具有许多直接的好处,例如能够对大多数内置类型进行子类化,或者引入启用计算属性的“描述符”。 出于兼容性原因,默认情况下类仍然是老式的 。 新样式类是通过指定另一个新样式类(即类型)作为父类来创建的,或者如果不需要其他父类,则指定“顶级类型”对象。 除了返回的类型外,新式类的行为在许多重要细节上与旧式类的行为不同。 其中一些更改是新对象模型的基础,例如调用特殊方法的方式。其他是出于兼容性问题之前无法实现的“修复”,例如多重继承情况下的方法解析顺序。 Python 3 只有新式类 。 无论您是否从子类object化,类都是 Python 3 中的新样式。
直到 Python 2.1,旧式类是用户唯一可用的风格。
(旧式)类的概念与类型的概念无关:如果x是旧式类的实例,则x.__class__ 指定 的类x,但type(x)始终是<type 'instance'>。
x
x.__class__
type(x)
<type 'instance'>
这反映了一个事实,即所有老式实例,独立于它们的类,都是用一个称为实例的内置类型实现的。
Python 2.2 引入了新式类,以统一类和类型的概念 。新式类只是用户定义的类型,不多也不少。
如果 x 是新式类的实例,则type(x)通常与 相同x.__class__(尽管这不能保证——允许新式类实例覆盖为 的返回值x.__class__)。
引入新型类的主要动机是提供具有完整元模型的统一对象模型 。
它还具有许多直接的好处,例如能够对大多数内置类型进行子类化,或者引入启用计算属性的“描述符”。
出于兼容性原因,默认情况下类仍然是老式的 。
新样式类是通过指定另一个新样式类(即类型)作为父类来创建的,或者如果不需要其他父类,则指定“顶级类型”对象。
除了返回的类型外,新式类的行为在许多重要细节上与旧式类的行为不同。
其中一些更改是新对象模型的基础,例如调用特殊方法的方式。其他是出于兼容性问题之前无法实现的“修复”,例如多重继承情况下的方法解析顺序。
Python 3 只有新式类 。
无论您是否从子类object化,类都是 Python 3 中的新样式。
object