一尘不染

为什么 Python 类会继承对象?

python

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

我刚刚找到了一些执行此操作的代码,但我找不到很好的理由。

class MyClass(object):
    # class code follows...

阅读 201

收藏
2022-02-23

共1个答案

一尘不染

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

在 Python 3 中,除了 Python 2 和 3 的兼容性之外,没有理由. 在 Python 2 中,有很多原因


Python 2.x 故事:

在 Python 2.x(从 2.2 开始)中,有两种样式的类取决于object作为基类的存在与否:

  1. “经典”样式类:它们没有object作为基类:

```py

class ClassicSpam: # no base class
… pass
ClassicSpam.bases
()
```

  1. “新”样式类:它们直接或间接(例如从内置类型继承)object作为基类:

```py

class NewSpam(object): # directly inherit from object
… pass
NewSpam.bases
(,)
class IntSpam(int): # indirectly inherit from object…
… pass
IntSpam.bases
(,)
IntSpam.bases[0].bases # … because int inherits from object
(,)
```

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

  • 支持描述符。具体来说,使用描述符可以实现以下构造:
  • classmethod:接收类作为隐式参数而不是实例的方法。
  • staticmethod:不接收隐式参数self作为第一个参数的方法。
  • properties with property:创建用于管理属性的获取、设置和删除的函数。
  • __slots__:节省类的内存消耗,也可以更快地访问属性。当然,它确实施加了限制
  • 静态方法:让您自定义如何创建新的__new__类实例。
  • 方法解析顺序(MRO):在尝试解析要调用的方法时,将按照什么顺序搜索类的基类。
  • 与 MRO 相关,super调用. 又见,super()算超。

如果您不继承 from 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 会为您插入它,所以它真的没有区别在幕后。

2022-02-23