我知道class foo(object)是一种古老的定义班级的方法。但我想更详细地了解一下这两者之间的区别。
您使用的是哪个版本的python。从2.6/3.0 POV来看,这是一回事。与2.5(和以前的)版本不同。你现在用的是什么?
在python中,旧样式类和新样式类的区别可能是什么?
@温迪,看来你已经有几年的时间来考虑这个问题了,所以你能选择一个答案来回答这个问题吗?甚至看起来社区已经提出了建议。;-)
在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。
更准确的说法是"声明新样式类的方法"。顺便说一句,从python 3.0"class foo:"开始是一个新的风格类。
子类化object生成一个新的风格类。新型课程的两个众所周知的优势是:
元类(类似于类工厂,但工作透明)
属性(getter和setter…)
实际上,元类也适用于旧式类。一些属性功能也可以工作(getter,而不是setter)
提到这个foo类(object)中的对象旨在使您的python 3代码与python 2和3兼容。