class ClassName versus class ClassName(object)
有什么区别:
1 2 | class ClassName(object): pass |
和
1 2 | class ClassName: pass |
当我调用这些类的模块的帮助函数时,您可以在帮助的类标题下读取第一个案例的
(我知道
在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网站
第二个示例演示了一个旧样式类。
在python 3中,默认情况下使用新的样式类,您将不再需要子类