Python中类foo和类foo(对象)之间的区别

Difference between class foo and class foo(object) in Python

我知道class foo(object)是一种古老的定义班级的方法。但我想更详细地了解一下这两者之间的区别。


在Python2.2之前,基本上有两种不同类型的类:由C扩展和C编码的内置(类型)定义的类和由Python类语句(类)定义的类。当您想要混合Python类型和内置类型时,这会导致问题。最常见的原因是子类化。如果您想在python代码中对列表类型进行子类化,那么您运气不好,因此使用了各种各样的解决方法,例如(在userlist模块中)对列表的纯python实现进行子类化。

这是一个相当难看的问题,所以在2.2中有一个统一Python和内置类型的动作,包括继承它们的能力。结果是"新样式类"。但是,这些类与旧样式类有一些不兼容的区别,因此为了向后兼容,裸类语法创建了一个旧样式类,而新行为是通过从对象继承获得的。最明显的行为差异是:

  • 方法分辨率顺序(MRO)。菱形继承层次结构中的行为存在差异(其中a继承b和c,两者都继承公共的基类d)。以前,方法是从左到右查找的,深度优先(即a b d c d),但是如果c重载d的成员,a将不会使用它(因为它首先发现d的实现),这是bad用于各种类型的编程(例如使用mixin类)。新的样式类将把这种情况视为一个b c d(查看类的__mro__属性以查看它将搜索的顺序)。

  • 添加了__new__构造函数,它允许类充当工厂方法,而不是返回类的新实例。用于返回特定的子类,或者重用不可变的对象,而不是在不需要更改创建接口的情况下创建新的子类。

  • 描述符。这些是属性、类方法、静态方法等背后的特性。本质上,它们提供了一种方法来控制访问或设置(新样式)类的特定属性时会发生什么。


class foo(object):是声明类的"新"方法。

这个更改是在python 2.2中进行的,有关差异的解释,请参阅这个pep。


子类化object生成一个新的风格类。新型课程的两个众所周知的优势是:

  • 元类(类似于类工厂,但工作透明)
  • 属性(getter和setter…)


提到这个foo类(object)中的对象旨在使您的python 3代码与python 2和3兼容。