class ClassName与类ClassName(对象)

时间:2012-04-06 13:12:10

标签: python class object

有什么区别:

class ClassName(object):
    pass

class ClassName:
    pass

当我调用这些类的模块的帮助功能时,您可以阅读____builtin____.object以获取CLASS标题下的第一个案例。对于第二种情况,它只显示类名。这些类和/或其可能的方法之间是否存在功能差异?

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

2 个答案:

答案 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

http://docs.python.org/release/2.5.2/ref/node33.html

答案 1 :(得分:5)

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

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

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