python - 类ClassName与类ClassName(对象)

标签 python class object

有什么区别:

class ClassName(object):
    pass

class ClassName:
    pass

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

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

最佳答案

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

“新风格”类的最大好处是跨 Python 的类型统一——在此之前,不能正确地继承内置类型,如 int、list、dict。还指定了一个“描述符协议(protocol)”,它描述了用于检索和设置对象属性的协议(protocol),从而为语言提供了很大的灵 active 。 (在类中使用 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

关于python - 类ClassName与类ClassName(对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10043963/

相关文章:

java - 类的每个对象都有自己的每个非静态成员变量的副本

java - 如何使用 OOP、构造函数和对象将变量传递给方法和主方法

python - 检测图像中的漫画对话气泡区域

python - 带有 OAuth 和 Python 的 Gmail API - AccessTokenRefreshError : invalid_grant

php - 无法让 PHP PDO 和 OOP 类工作

Python类: Employee management system

c++ - 是否可以重用构造函数?

python - 如何在python中传递csv文件的第一列

python - CSV 到字典列表 - 更好的方法?

ios - 访问另一个类中的 socket (Swift)