我知道 class foo(object)是定义类的一种老式方法。但我想更详细地了解这两者之间的区别。
class foo(object)
class foo(object):是声明类的“新”方法。
class foo(object):
此更改是在 python 2.2中进行的,请参阅 这个 PEP 的解释中的差异。
对 object进行子类化会产生一个新样式类:
object
在 python 2.2之前,基本上有两种不同类型的类: 一种是由 C 扩展和 C 编码的内置函数(type)定义的类,另一种是由 python 类语句(class)定义的类。当您想要混合 Python 类型和内置类型时,这会导致问题。最常见的原因是子类化。如果您想在 python 代码中子类化列表类型,那么您就不走运了,因此使用了各种变通方法,例如子类化列表的纯 python 实现(在 UserList 模块中)。
这是一个相当丑陋的,所以在2.2中有一个 让开来统一 python 和内置类型,包括从它们获得 继承的能力。结果是“新样式类”。然而,这些类与旧式类有一些不兼容的区别,所以为了向后兼容,裸类语法创建了一个旧式类,而新的行为是通过从对象继承获得的。最明显的行为差异是:
方法分辨率顺序(MRO)。菱形继承层次结构中的行为有所不同(A 继承自 B 和 C,两者都继承自一个共同的基类 D)以前,方法是从左到右查找的,深度优先(即 A B D C D)然而,如果 C 重载了 D 的一个成员,它就不会被 A 使用(因为它首先找到 D 的实现)这对各种编程风格都不利(例如使用混合类)。新样式类将把这种情况视为 A B C D (查看类的 __mro__属性以查看它将搜索的顺序)
__mro__
添加了 __new__构造函数,该构造函数允许类充当工厂方法,而不是返回类的新实例。对于返回特定的子类,或者重用不可变对象而不是在不更改创建接口的情况下创建新对象非常有用。
__new__
描述符 。这些是诸如属性、类方法、静态方法等等背后的特性。本质上,它们提供了一种方法来控制在访问或设置(新样式)类的特定属性时发生的情况。
参考 < a href = “ https://mail.python.org/pipermail/python-dev/2014-August/135701.html”rel = “ nofollow noReferrer”> this Foo (object)类中的对象旨在使 python3代码与 python2和 python3兼容。