Python中类foo和类foo(对象)之间的区别

时间:2008-12-01 21:17:41

标签: python

我知道class foo(object)是一种古老的学校定义课程的方式。但我想更详细地了解这两者之间的区别。

4 个答案:

答案 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会产生一个新式的类。新式课程的两个众所周知的优点是:

  • 元类(如类工厂,但透明地工作)
  • 属性(getter& setters ...)

答案 3 :(得分:0)

引用this Foo(object)类中的对象旨在使您的python 3代码与python 2和3兼容。