类名 ClassName 与 class ClassName(object) 的区别

31

什么是以下代码之间的区别:

class ClassName(object):
    pass

class ClassName:
    pass
当我调用模块的帮助函数时,在help标题下第一个case中可以读到____builtin____.object,而在第二个case中只显示类名。这些类之间是否有功能上的区别或者可能存在不同的方法?(我知道 class Classname(ParentClassName) 有实际用途)

2
第一个是新式类,另一个是旧式类。您可能希望查看此SO答案以了解两者之间的差异。 - Makoto
仅供参考,虽然在Python3中您不需要执行class ClassName(object):,但我认为您仍应该这样做。这更清晰。 - Jakob Bowyer
我已经检查过了。我不理解其他帖子中指出的所有差异。但在这些帖子中,大多数人似乎建议使用新风格。奇怪的是,Python2.7标准库模块的类只使用旧风格。(例如,请检查模块timeit的类Timer - Bentley4
2个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
25
在Python 2.x中,当您从“object”继承时,您的类是一个“新样式”类 - 这是在Python 2.2(大约2001年)实现的 - 不继承“object”的情况会创建一个“旧样式”类,实际上只为向后兼容而保留。 “新样式”类的巨大优点是统一了Python中的类型 - 在此之前,无法正确地对内置类型(例如int,list,dict)进行子类化。还指定了“描述符协议”,该协议描述了检索和设置对象中属性的协议,从而使语言具有很大的灵活性(当在类中使用Python“property”时更为明显)。 真正的区别不在于“继承自object”,而是因为Python中的类也是对象,这确实改变了类本身(类的类称为其“元类”)。因此,如果将元类设置为“type”,则无需从object继承即可拥有新样式类。 在Python 2.x版本中强烈建议所有的类都是新样式的 - 使用旧样式的类可能对一些单一的简单情况有效,但当您尝试使用属性、pickle、描述符和其他高级特性时,它们可能会产生许多微妙且难以找到的错误。最重要的是,当您尝试检查对象的"type"时,所有来自旧样式类的对象(即使它们来自不同的用户定义类)都将是相同的(类型为"instance")。 在Python 3.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


8

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,