26

有什么区别:

class ClassName(object):
    pass

class ClassName:
    pass

当我调用这些类的模块的帮助功能时,您可以____builtin____.object在帮助的 CLASS 标题下阅读第一个案例。对于第二种情况,它只显示类名。这些类和/或其可能的方法之间是否存在任何功能差异?

(我知道class Classname(ParentClassName)有功能用途)

4

2 回答 2

22

在 Python 2.x 中,当您从“对象”继承时,您的类是一个“新样式”类 - 这是在 Python 2.2 中实现的(大约 2001 年) - 非从“对象”继承的情况会创建一个“旧样式”类,这实际上只是为了向后兼容而维护的。

“新风格”类的最大好处是跨 Python 的类型统一——在此之前,不能正确地继承内置类型,如 int、list、dict。还指定了一个“描述符协议”,它描述了用于检索和设置对象属性的协议,从而为语言提供了很大的灵活性。(当一个人确实在一个类中使用 Python“属性”时,它会更加明显)。

真正不同的不是“从对象继承”,而是因为 Python 中的类也是对象,所以这确实改变了 class'class 本身(一个 class'class 被称为它的“元类”)。因此,如果您将元类设置为“类型”,则无需从对象继承即可拥有新的样式类。

强烈建议在 Python 2.x中,您的所有类都是新样式 - 使用旧样式类可能适用于一些简单直接的情况,但是当您尝试使用时,它们会产生很多微妙的、难以发现的错误属性、pickle、描述符和其他高级功能。最重要的是,当您尝试检查对象的“类型”时,旧样式类中的所有对象都将是相同的(类型“实例”),即使它们来自不同的用户定义类。

在 Python 3.x 版本中,所有类都是新样式 - 无需设置元类。

Python 的文档“数据模型”是“法律之书”,其中详细定义了两种类类型的行为(足以让人们重新实现该语言):

http://docs.python.org/reference/datamodel.html

Guido 的这篇博客文章用一种更轻松的语言讨论了新样式类背后的动机:

http://python-history.blogspot.com.br/2010/06/new-style-classes.html

http://docs.python.org/release/2.5.2/ref/node33.html

于 2012-04-06T13:27:31.573 回答
7

ClassName(object)使用新样式类:http ://docs.python.org/release/2.5.2/ref/node33.html

第二个示例演示了一个旧样式类。

在 python 3 中,默认使用新样式类,您将不再需要子类化object.

于 2012-04-06T13:15:27.270 回答