Python中class foo和class foo(object)的区别

我知道class foo(object)是定义类的老派方式。 但我想更详细地了解这两者之间的区别。

在Python 2.2之前,基本上有两种不同的类:由C扩展和C编译的内build函数(types)定义的类,以及由python类语句(类)定义的类。 当你想要混合Pythontypes和内buildtypes时,这会导致问题。 最常见的原因是inheritance。 如果您想在Python代码中inheritance列表types,那么您运气不佳,因此使用了各种替代方法,例如使用子列表的纯Python实现(在UserList模块中)。

这是一个相当难看的东西,所以在2.2中有一种统一python和builtintypes的举动 ,包括从它们inheritance的能力。 结果是“新风格类”。 然而,这些与旧式类有一些不兼容的区别,所以为了向后兼容,裸类语法创build一个旧式的类,而新的行为是通过从对象inheritance来获得的。 最明显的行为差异是:

  • 方法parsing顺序(MRO)。 钻石形inheritance层次结构中的行为存在差异(其中A同时inheritanceB和C,它们都从公共基类Dinheritance)。以前,方法从左到右,先深入查找(即ABDCD)。如果C重载D的一个成员,它将不会被A使用(因为它首先发现D的实现)这对于各种编程风格(例如使用混合类)是不利的,新的风格类将把这种情况视为ABCD, (查看类的__mro__属性来查看它将search的顺序)

  • 添加了__new__构造函数,它允许类作为工厂方法,而不是返回类的新实例。 用于返回特定的子类,或重用不可变对象,而不必创build新的,而不必更改创build接口。

  • 描述符 。 这些是属性,类方法,静态方法等背后的特征。从本质上讲,它们提供了一种方法来控制访问或设置(新风格)类的特定属性时发生的情况。

class foo(object):是声明类的“新”方式。

这个改变是在Python 2.2中进行的,请参阅这个PEP来解释这个差异。

inheritanceobject产生一个新的类。 新风格的两个着名的优点是:

  • 元类(如类工厂,但透明)
  • 属性(获取者和设置者…)