Python 类为什么继承对象?

2024-11-27 10:43:00
admin
原创
12
摘要:问题描述:为什么下面的类声明继承自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。但我想显式总是比隐式更好(见鬼)

参考

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   657  
  如何借鉴华为IPD体系优化企业研发?在当今竞争激烈的市场环境中,企业要想保持技术领先和产品竞争力,必须拥有一套高效且严谨的研发管理体系。华为作为全球领先的ICT解决方案提供商,其集成产品开发(IPD, Integrated Product Development)体系与质量管理体系(如ISO 9000系列)的融合实践,...
IPD项目管理   15  
  IPD流程图的7种经典绘制方法详解在产品开发领域,集成产品开发(Integrated Product Development,简称IPD)流程被广泛应用,以提高产品开发的效率和质量。IPD流程图作为这一流程的可视化工具,其绘制方法至关重要。本文将详细介绍七种经典的IPD流程图绘制方法,帮助项目管理人员和团队更好地理解和...
IPD研发管理体系   18  
  IPD流程:企业创新管理的核心引擎在当今快速变化的市场环境中,企业要想持续保持竞争力,就必须不断进行创新。而IPD(Integrated Product Development,集成产品开发)流程作为一种先进的产品开发管理模式,正逐渐成为众多企业提升创新能力、加速产品上市速度、降低开发成本的重要选择。本文将深入探讨IP...
IPD管理   18  
  IPD流程与传统产品开发流程的概述在产品开发领域,企业不断寻求高效、系统的管理方法以确保产品能够顺利从概念转化为市场成功的产品。集成产品开发(Integrated Product Development,简称IPD)流程与传统产品开发流程是两种截然不同的管理理念和方法。传统产品开发流程往往以职能部门为核心,各部门按顺序...
IPD流程中PDCP是什么意思   16  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用