关于Python的class ClassName versus class ClassName(object)

class ClassName versus class ClassName(object)

本问题已经有最佳答案,请猛点这里访问。

有什么区别:

1
2
class ClassName(object):
    pass

1
2
class ClassName:
    pass

当我调用这些类的模块的帮助函数时,您可以在帮助的类标题下读取第一个案例的____builtin____.object。对于第二种情况,它只显示类名。这些类和/或其可能的方法之间有什么功能上的区别吗?

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


在python 2.x中,当您从"object"继承时,您的类是一个"new style"类,它在python 2.2中实现(大约在2001年),而非从"object"案例继承则创建了一个"old style"类,实际上它是为了向后兼容而维护的。

"新样式"类的最大好处是跨Python统一类型——在此之前,不能正确地对内置类型(如int、list、dict)进行子类划分。还指定了一个"描述符协议",它描述了一个在对象中检索和设置属性的协议,给了语言很大的灵活性。(在类中使用python"property"时,它更可见)。

真正不同的不是"从对象继承",而是,因为Python中的类也是对象,所以这确实改变了类的类本身(类的类称为其"元类")。因此,如果将元类设置为"类型",则不需要从对象继承来拥有新的样式类。

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

在Python3.x版本中,所有类都是新样式——不需要设置元类。

python的文档"datamodel"是"法律之书",其中类类型是详细定义的(足以让人重新实现语言):

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网站


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

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

在python 3中,默认情况下使用新的样式类,您将不再需要子类object