我知道这class foo(object)
是一种老式的定义课程的方式.但我想更详细地了解这两者之间的区别.
在python 2.2之前,基本上有两种不同类型的类:由C扩展和C编码内置(类型)定义的类和由python类语句(类)定义的类.当你想混合python-types和内置类型时,这会导致问题.最常见的原因是子类化.如果你想在python代码中继承列表类型,那你就运气不好,因此使用了各种变通方法,比如子类化列表的纯python实现(在UserList模块中).
这是一个相当难看的,所以在2.2中有一个统一python和内置类型的举动,包括从它们继承的能力.结果是"新风格".但是这些与旧式类有一些不兼容的差异,因此对于向后兼容性,裸类语法创建旧式类,而新行为是通过从对象继承获得的.最明显的行为差异是:
方法解析顺序(MRO).菱形继承层次结构中的行为存在差异(其中A继承自B和C,它们都从公共基类D继承.以前,方法从左到右查找,深度优先(即ABDCD)但是如果C重载了D的一个成员,它将不会被A使用(因为它首先发现D的实现)这对于各种编程风格(例如使用mixin类)是不好的.新样式类将这种情况视为ABCD, (查看__mro__
类的属性以查看它将搜索的顺序)
在__new__
构造函数中添加,允许类充当工厂方法,而不是返回类的新实例.用于返回特定子类,或重用不可变对象而不是创建新对象而无需更改创建接口.
描述符.这些是属性,类方法,静态方法等背后的特征.本质上,它们提供了一种方法来控制在(新样式)类上访问或设置特定属性时发生的事情.
class foo(object):
是宣布课程的"新"方式.
这个更改是在python 2.2中进行的,请参阅此PEP以了解差异的解释.