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
产生一个新的类。 新风格的两个着名的优点是:
- 元类(如类工厂,但透明)
- 属性(获取者和设置者…)