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