它们之间的区别是什么:
class ClassName(object):
pass和
class ClassName:
pass当我调用这些类的模块的help函数时,您可以在help的类标题下读取第一种情况的____builtin____.object。对于第二种情况,它只显示类名。这些类和/或其可能的方法之间是否存在功能上的差异?
(我知道class Classname(ParentClassName)有一个功能用法)
发布于 2012-04-06 21:27:32
在Python2.x中,当你从"object“继承时,你的类是一个”新风格“的类--这是在Python2.2(大约2001年)中实现的--不从"object”继承的情况创建了一个“旧风格”类,实际上只是为了向后兼容而维护的。
“新风格”类的最大好处是统一了Python中的类型-在此之前,人们不能正确地子类化内置类型,如int,list,dict。还指定了“描述符协议”,它描述了在对象中检索和设置属性的协议,给语言提供了很大的灵活性。(当在类中使用Python“属性”时,这一点更加明显)。
真正有区别的并不是真正的“继承自对象”,而是因为Python中的类也是对象,这确实改变了类的类本身(类的类被称为“元类”)。因此,如果您将元类设置为"type",则无需继承object即可获得新的样式类。
强烈建议在Python2.x中,所有的类都是新样式--使用旧样式的类可能适用于一些简单的情况,但当您尝试使用属性、pickle、描述符和其他高级特性时,它们可能会生成许多微妙的、难以找到的错误。最重要的是,当您尝试检查对象的“类型”时,旧样式类中的所有对象都是相同的(类型为"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
发布于 2012-04-06 21:15:27
ClassName(object)使用新的样式类:http://docs.python.org/release/2.5.2/ref/node33.html
第二个示例演示了一个旧风格的类。
在Python3中,默认情况下使用新的样式类,您将不再需要子类化object。
https://stackoverflow.com/questions/10043963
复制相似问题