在Python中,子类化“object”类的目的是什么?

67
所有的Python内置类都是object的子类,我也遇到过许多用户自定义的类也是如此。为什么?object这个类的目的是什么?它只是一个空类,对吗?
6个回答

63
注意:在Python 3中,新式类是默认的。在那里子类化object是不必要的。请阅读下面的更多信息以了解在Python 2中使用的方法。

简而言之,它释放了神奇的小马。

长话短说,Python 2.2及更早版本使用“旧式类”。它们是类的一个特殊实现,并且它们有一些限制(例如,您不能子类化内置类型)。修复此问题的方法是创建新样式的类。但是,这样做将涉及一些不向后兼容的更改。因此,为确保为旧样式类编写的代码仍然有效,创建了object类以作为所有新样式类的超类。 因此,在Python 2.X中,class Foo: pass将创建一个旧式类,class Foo(object): pass将创建一个新样式类。

更详细地了解,请参见Guido的Unifying types and classes in Python 2.2

总的来说,养成使所有类都成为新样式的习惯是一个好主意,因为某些东西(例如@property装饰器)在旧样式类中不起作用。


@thetaiko列出了一些其他只适用于新风格的事项,这些都是值得了解的。 - David Wolever

13

4

3

没错,但它将类标记为新样式类。新开发的类应该使用 object 基类,因为它成本低,并且能让你的代码具有未来性。


1
简而言之,经典类不需要超类,但是它们有一些限制,如果不破坏大量旧代码,就无法解决这些限制。因此,他们创建了新式类的概念,这些类从object子类化,现在您可以做很酷的事情,比如定义属性,而且子类化dict不再是一种痛苦和奇怪错误的练习。
详细信息请参见Python文档的3.3节:New-style and classic classes.

0

Python 2.2引入了“新式类”,相对于未继承object的旧式类,它具有许多额外的功能。子类化object是指示您的类应该是新式类而不是旧式类的选择方式。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接