Python 类为什么继承对象?

2024-11-27 10:43:00
admin
原创
153
摘要:问题描述:为什么下面的类声明继承自object?class MyClass(object): ... 解决方案 1:类声明继承自有什么理由吗object?在 Python 3 中,除了兼容 Python 2 和 3 之外,没有其他原因。在 Python 2 中,原因有很多。Python 2.x 的故事...

问题描述:

为什么下面的类声明继承自object

class MyClass(object):
    ...

解决方案 1:

类声明继承自有什么理由吗object

在 Python 3 中,除了兼容 Python 2 和 3 之外,没有其他原因。在 Python 2 中,原因有很多


Python 2.x 的故事:

在 Python 2.x(从 2.2 开始)中,根据是否存在object基类,有两种类型的类:

  1. “经典”风格的类:它们没有object基类:

>>> class ClassicSpam:      # no base class
...     pass
>>> ClassicSpam.__bases__
()
  1. “新”样式类:它们直接或间接地(例如从内置类型继承)具有object以下基类:

>>> class NewSpam(object):           # directly inherit from object
...    pass
>>> NewSpam.__bases__
(<type 'object'>,)
>>> class IntSpam(int):              # indirectly inherit from object...
...    pass
>>> IntSpam.__bases__
(<type 'int'>,) 
>>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
(<type 'object'>,)

毫无疑问,在编写类时,您总是希望使用新式类。这样做的好处很多,下面列出其中一些:

  • 支持描述符。具体来说,使用描述符可以实现以下构造:

1. `classmethod`:以类而不是实例作为隐式参数接收的方法。
2. `staticmethod``self`:不接收隐式参数作为第一个参数的方法。
3. 属性`property`:创建用于管理属性的获取、设置和删除的函数。
4. `__slots__`:节省类的内存消耗,同时加快属性访问速度。当然,它也有一定的局限性。
  • 静态方法__new__:允许您自定义如何创建新的类实例。

  • 方法解析顺序(MRO):当尝试解析调用哪个方法时,将按照什么顺序搜索类的基类。

  • 与 MRO 相关,super调用。另请参阅,super()视为超级。

如果你不继承object,就忘掉这些吧。关于前面的要点以及“新”样式类的其他优点的更详尽描述可以在这里找到。

新式类的一个缺点是类本身占用的内存更多。除非你创建了很多类对象,否则我怀疑这不会是个问题,而且这是一个优点中的缺点。


Python 3.x 的故事:

在 Python 3 中,事情变得简单了。只有新式类存在(简称为类),因此,添加的唯一区别object是需要您输入 8 个字符。这:

class ClassicSpam:
    pass

与以下完全等同(除了名称 :-):

class NewSpam(object):
     pass

以及这个:

class Spam():
    pass

每个人都有object自己的__bases__

>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]

那么,你应该怎么做呢?

在 Python 2 中:始终 显式地从 继承object。获取特权。

在 Python 3 中:如果您编写的代码试图与 Python 无关,则从中继承object,也就是说,它需要在 Python 2 和 Python 3 中都能工作。否则不要这样做,这真的没有什么区别,因为 Python 会在后台为您插入它。

解决方案 2:

Python 3

  • class MyClass(object):= 新式类

  • class MyClass:= 新式类(隐式继承自object

Python 2

  • class MyClass(object):= 新式类

  • class MyClass:=老式阶级


解释

在 Python 3.x 中定义基类时,可以object从定义中删除。然而,这可能会带来一个非常难以追踪的问题……

Python 在 Python 2.2 中引入了新式类,而现在旧式类已经相当老旧了。旧式类的讨论隐藏在 2.x 文档中,而在 3.x 文档中则不存在。

问题是,Python 2.x 中旧式类的语法与 Python 3.x 中新式类的替代语法相同。Python 2.x 仍然被广泛使用(例如 GAE、Web2Py),任何代码(或程序员)在不知情的情况下将 3.x 样式的类定义带入 2.x 代码中,最终都会产生一些严重过时的基础对象。而且由于旧式类不在任何人的关注范围内,他们可能不知道是什么影响了他们。

因此,只需用很长的方式将其说清楚,就可以让 2.x 开发人员少受些苦。

解决方案 3:

是的,这是一个“新样式”对象。这是 python2.2 中引入的一个功能。

新式对象与传统对象具有不同的对象模型,有些东西无法与旧式对象正常工作,例如,super()@property描述符。请参阅本文以详细了解什么是新式类。

SO 链接描述了差异:Python 中旧式类和新式类有什么区别?

解决方案 4:

《Learn Python the Hard Way》中的历史:

Python 最初对类的解释在许多方面都存在严重缺陷。当这个错误被发现时已经太晚了,他们不得不支持它。为了解决这个问题,他们需要某种“新类”风格,这样“旧类”就可以继续工作,但你可以使用新的更正确的版本。

他们决定使用小写的单词“object”作为“类”,从中继承而来,从而形成一个类。这很令人困惑,但类从名为“object”的类继承而来,从而形成一个类,但它实际上不是一个对象,而是一个类,但不要忘记从对象继承。

另外,只是为了让您了解新式类和旧式类之间的区别,新式类总是从 object类继承或从继承自的另一个类继承object

class NewStyle(object):
    pass

另一个例子是:

class AnotherExampleOfNewStyle(NewStyle):
    pass

旧式基类如下所示:

class OldStyle():
    pass

旧式的子类如下所示:

class OldStyleSubclass(OldStyle):
    pass

您可以看到,旧式基类不会从任何其他类继承,但是,旧式类当然可以相互继承。从对象继承可确保每个 Python 类中都有某些功能。新式类是在 Python 2.2 中引入的

解决方案 5:

是的,这是历史性的。没有它,就会创建一个旧式类。

如果在旧式对象上使用type(),则只会获得“实例”。在新式对象上,您将获得其类。

解决方案 6:

类创建语句的语法:

class <ClassName>(superclass):
    #code follows

在没有任何其他您特别想要继承的超类的情况下,superclass应该始终是object,它是 Python 中所有类的根。

object从技术上讲,它是 Python 中“新式”类的根源。但如今,新式类几乎是唯一的类样式。

但是,如果你在创建类时没有明确使用该词object,那么正如其他人提到的那样,Python 3.x 会隐式地从超类继承object。但我想显式总是比隐式更好(见鬼)

参考

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1259  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理理念和方法,在提升企业创新能力方面发挥着至关重要的作用。它打破了传统产品开发过程中部门之间的壁垒,通过整合资源、优化流程,实现产品的快速、高效开发,为企业在激烈的市场竞争中赢得优势。IPD流程管理的核心概念IPD流程...
IPD流程中PDCP是什么意思   11  
  IPD(Integrated Product Development)流程管理作为一种先进的产品开发管理模式,旨在通过整合各种资源,实现产品的高效、高质量开发。在这一过程中,团队协作无疑是成功的关键。有效的团队协作能够打破部门壁垒,促进信息共享,提升决策效率,从而确保产品开发项目顺利推进。接下来,我们将深入探讨IPD流...
IPD培训课程   9  
  IPD(Integrated Product Development)研发管理体系作为一种先进的产品开发理念和方法,在众多企业中得到了广泛应用。它旨在打破部门壁垒,整合资源,实现产品开发的高效、协同与创新。在项目周期方面,IPD研发管理体系有着深远且多维度的影响,深入剖析这些影响,对于企业优化产品开发流程、提升市场竞争...
华为IPD流程   11  
  IPD(Integrated Product Development)流程管理是一种先进的产品开发管理模式,旨在通过整合企业的各种资源,实现产品的高效、高质量开发。它涵盖了从产品概念提出到产品退市的整个生命周期,对企业的发展具有至关重要的意义。接下来将详细阐述IPD流程管理的五个阶段及其重要性。概念阶段概念阶段是IPD...
IPD概念阶段   12  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用