有什么区别:
class ClassName(object):
pass
和
class ClassName:
pass
当我调用这些类的模块的帮助功能时,您可以阅读____builtin____.object
以获取CLASS标题下的第一个案例。对于第二种情况,它只显示类名。这些类和/或其可能的方法之间是否存在功能差异?
(我知道class Classname(ParentClassName)
具有功能用途)
答案 0 :(得分:18)
在Python 2.x中,当你从“object”继承时,你的类是一个“新风格”类 - 它是在Python 2.2(2001年左右)中实现的 - 非继承自“object”的情况创建了一个“旧” style“class,实际上只是为了向后兼容而维护。
“新风格”类的巨大好处是跨Python的类型的统一 - 在此之前,人们不能正确地子类化内置类型,如int,list,dict。还有一个“描述符协议”,它描述了一个用于检索和设置对象属性的协议,为语言提供了很大的灵活性。 (当在类中使用Python“属性”时,它更加明显。)
有什么区别实际上不是“继承自对象”,但是,由于Python中的类也是对象,这确实改变了类的类本身(类的类被称为“元类”)。因此,如果将元类设置为“type”,则不需要从object继承以获得新的样式类。
强烈建议在Python 2.x中,所有类都是新的样式 - 使用旧样式类可能适用于某些简单直接的情况,但它们会产生很多微妙,困难在尝试使用属性,pickle,描述符和其他高级功能时查找,错误。最重要的是,当您尝试检查对象的“类型”时,对于旧样式类中的所有对象,它们将是相同的(类型“实例”),即使它们来自不同的用户定义类。
在Python版本3.x中,所有类都是新样式 - 无需设置元类。
Python的文档“datamodel”是“法律书籍”中两者的行为 class typs详细定义(足以让人们重新实现语言):http://docs.python.org/reference/datamodel.html
Guido的这篇博文讲述了轻松语言新风格课程的动机:
http://python-history.blogspot.com.br/2010/06/new-style-classes.html
答案 1 :(得分:5)
ClassName(object)
使用新的样式类:http://docs.python.org/release/2.5.2/ref/node33.html
第二个例子演示了一个旧的样式类。
在python 3中,默认情况下使用新的样式类,您将不再需要子类object
。