类 ClassName 与类 ClassName(object) [重复]

Posted

技术标签:

【中文标题】类 ClassName 与类 ClassName(object) [重复]【英文标题】:class ClassName versus class ClassName(object) [duplicate] 【发布时间】:2012-04-20 02:23:39 【问题描述】:

有什么区别:

class ClassName(object):
    pass

class ClassName:
    pass

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

(我知道class Classname(ParentClassName)有函数用途)

【问题讨论】:

第一个是newstyle类,另一个是oldstyle类。您可能想查看this SO answer 以了解两者之间的区别。 只是添加到它,虽然你不需要在 python3 中做class ClassName(object): 我认为你仍然应该这样做。它更清晰 我查过了。我不明白其他线程中指出的所有差异。但在这些线程中,大多数人似乎建议使用新样式。奇怪的是python2.7标准库的模块类只使用了旧样式。 (检查模块timeit 的类Timer 例如) 【参考方案1】:

在 Python 2.x 中,当您从“对象”继承时,您的类是一个“新样式”类 - 这是在 Python 2.2 中实现的(大约在 2001 年) - 非从“对象”继承的情况会创建一个“旧样式”类style" 类,实际上只是为了向后兼容而维护的。

“新风格”类的最大好处是跨 Python 的类型统一 - 在此之前,不能正确子类化内置类型,如 int、list、dict。还指定了一个“描述符协议”,它描述了用于在对象中检索和设置属性的协议,为语言提供了很大的灵活性。 (在类中使用 Python“属性”时会更明显)。

真正不同的并不是“从对象继承”,而是因为 Python 中的类也是对象,所以这确实改变了 class'class 本身(一个 class'class 被称为它的“元类”)。因此,如果您将元类设置为“类型”,则无需从对象继承即可拥有新的样式类。

强烈建议在 Python 2.x 中,您的所有类都是新样式 - 使用旧样式的类可能适用于一些简单直接的情况,但它们会产生很多微妙的、困难的在您尝试使用属性、pickle、描述符和其他高级功能时查找错误。最重要的是,当您尝试检查对象的“类型”时,旧样式类中的所有对象都将是相同的(类型“实例”),即使它们来自不同的用户定义类。

在 Python 3.x 版本中,所有类都是新样式 - 无需设置元类。

Python 的文档“数据模型”是“法律之书”,其中两者的行为 类类型被详细定义(足以让人们重新实现语言):

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

以上是关于类 ClassName 与类 ClassName(object) [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Classname.Variable 与 Classname 作为变量一起使用

未能在 NSManagedObject 类“ClassName”上调用指定的初始化程序

Symfony 从 String 类声明中获取 className 对象

Angular 2 通过 [class.className] 绑定添加多个类

使用框架中的CoreData时如何解决“类'ClassName'的NSManagedObject必须具有有效的NSEntityDescription”

使用具有相同 ClassName 的其他命名空间扩展类