为什么Python类继承对象?

2022-09-05 00:54:26

为什么以下类声明继承自 ?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__
    ()
    
  2. “新”样式类:它们直接或间接地(例如从内置类型继承)作为基类: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'>,)
    

毫无疑问,在编写课程时,您总是希望选择新式课程。这样做的好处很多,列出其中的一些:

如果您没有继承自 ,请忘记这些。可以在此处找到对以前的要点以及“新”样式类的其他好处的更详尽的描述。object

新式类的缺点之一是类本身对内存的要求更高。但是,除非你正在创建许多类对象,否则我怀疑这将是一个问题,它是在积极海洋中的消极沉没。


Python 3.x 的故事:

在Python 3中,事情被简化了。只有新样式的类存在(简称为类),因此,添加的唯一区别是要求您再键入8个字符。这:object

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中:始终显式地从对象继承。获得福利。

在Python 3中:如果你正在编写试图与Python无关的代码,也就是说,它需要在Python 2和Python 3中同时工作。否则不要,它真的没有什么区别,因为Python会在幕后为你插入它。object


答案 2

蟒蛇 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开发人员的眼泪。