有什么区别:
class ClassName(object):
pass
和
class ClassName:
pass
当我调用这些类的模块的帮助功能时,您可以____builtin____.object
在帮助的 CLASS 标题下阅读第一个案例。对于第二种情况,它只显示类名。这些类和/或其可能的方法之间是否存在任何功能差异?
(我知道class Classname(ParentClassName)
有功能用途)
在 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
ClassName(object)
使用新样式类:http ://docs.python.org/release/2.5.2/ref/node33.html
第二个示例演示了一个旧样式类。
在 python 3 中,默认使用新样式类,您将不再需要子类化object
.