60

所有 Python 内置程序都是子类,object我也遇到了许多用户定义的类。为什么?上课的目的是什么object?这只是一个空班,对吧?

4

6 回答 6

57

简而言之,它设置了免费的魔法小马。

总而言之,Python 2.2 和更早的版本使用“旧样式类”。它们是类的特定实现,并且有一些限制(例如,您不能子类化内置类型)。解决这个问题的方法是创建一种新的类风格。但是,这样做会涉及一些向后不兼容的更改。因此,为了确保为旧样式类编写的代码仍然有效,object创建该类以充当所有新样式类的超类。因此,在 Python 2.X 中,class Foo: pass将创建一个旧样式类class Foo(object): pass并将创建一个新样式类。

在更长的时间内,请参阅 Guido在 Python 2.2 中统一类型和类

而且,一般来说,养成让所有类都成为新样式的习惯是个好主意,因为有些东西(我想到的@property装饰器)不适用于旧样式的类。

于 2010-04-06T22:01:39.137 回答
11

简短的回答:子类化object有效地使它成为一个新样式的类(注意这是不必要的,因为在 Python 3.x 中是自动的)

new style有关类和类之间的区别old style:请参阅此 stackoverflow 问题。有关完整的故事:请参阅这篇关于 Python 类型和对象的精彩文章

于 2010-04-06T22:04:07.230 回答
4

它与类的“新式”有关。你可以在这里阅读更多关于它的信息: http: //docs.python.org/tutorial/classes.html#multiple-inheritance和这里​​:http ://docs.python.org/reference/datamodel.html#new-style -and-classic-classes

使用新型类将允许您使用“Python 更新的、通用的特性,如 __slots__、描述符、属性和 __getattribute__()”。

于 2010-04-06T22:02:32.300 回答
3

是的,但是它将该类标记为新样式类。新开发的类应该使用object基础,因为它的成本很低并且可以让您的代码面向未来。

于 2010-04-06T22:00:31.623 回答
1

简短的版本是,不需要超类的经典类具有在不破坏大量旧代码的情况下无法解决的局限性。所以他们创造了新式类的概念,从 继承object,现在你可以做一些很酷的事情,比如定义属性,子类化dict不再是痛苦和奇怪的错误的练习。

详细信息在 Python 文档的第 3.3 节:New-style and classic classes。

于 2010-04-06T22:03:29.870 回答
0

Python 2.2 引入了“新样式类”,相对于没有子类对象的旧样式类,它具有许多附加功能。Subclasses 对象是选择的方式来指示您的类应该是新样式类,而不是旧样式类。

于 2010-04-06T22:04:02.567 回答