类 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”