【发布时间】:2011-02-05 00:40:11
【问题描述】:
所有 Python 内置函数都是 object 的子类,我也遇到了许多用户定义的类。为什么? object 类的目的是什么?这只是一个空班,对吧?
【问题讨论】:
标签: python object deprecated future-proof new-style-class
所有 Python 内置函数都是 object 的子类,我也遇到了许多用户定义的类。为什么? object 类的目的是什么?这只是一个空班,对吧?
【问题讨论】:
标签: python object deprecated future-proof new-style-class
简而言之,它可以放出魔法小马。
长期以来,Python 2.2 和更早的版本都使用“旧样式类”。它们是类的特定实现,并且有一些限制(例如,您不能子类化内置类型)。解决这个问题的方法是创建一种新的类风格。但是,这样做会涉及一些向后不兼容的更改。因此,为了确保为旧式类编写的代码仍然有效,创建了object 类作为所有新式类的超类。
因此,在 Python 2.X 中,class Foo: pass 将创建一个旧样式类,class Foo(object): pass 将创建一个新样式类。
更多信息,请参阅 Guido 的 Unifying types and classes in Python 2.2。
而且,一般来说,养成让所有类都成为新样式的习惯是个好主意,因为有些东西(我想到的是 @property 装饰器)不适用于旧样式类。
【讨论】:
object。
简答:子类化object 有效地使其成为新样式 类(请注意,这是不必要的,因为在 Python 3.x 中是自动的)
关于new style 类和old style 类之间的区别:参见this stackoverflow question。完整的故事:见this nice writeup on Python Types and Objects。
【讨论】:
这与类的“新式”有关。您可以在此处阅读更多信息:http://docs.python.org/tutorial/classes.html#multiple-inheritance,也可以在此处阅读:http://docs.python.org/reference/datamodel.html#new-style-and-classic-classes
使用新型类将允许您使用“Python 更新的通用功能,例如 __slots__、描述符、属性和 __getattribute__()。”
【讨论】:
是的,但它将类标记为new-style 类。新开发的类应该使用 object 基础,因为它的成本很低并且可以让您的代码适应未来。
【讨论】:
简短的版本是,不需要超类的经典类具有在不破坏大量旧代码的情况下无法解决的局限性。所以他们创建了从object 子类化的新型类的概念,现在你可以做一些很酷的事情,比如定义属性,子类化dict 不再是痛苦和奇怪错误的练习。
详细信息在 Python 文档的第 3.3 节中:New-style and classic classes.
【讨论】:
Python 2.2 introduced "new style classes" 相对于没有子类对象的旧样式类具有许多附加功能。 Subclasses 对象是选择的方式来指示您的类应该是新样式类,而不是旧样式类。
【讨论】: