为什么 Python 类会继承对象?
类声明有什么继承自的理由object
吗?
我刚刚找到了一些执行此操作的代码,但我找不到很好的理由。
class MyClass(object):
# class code follows...
-
类声明有什么继承自的理由
object
吗?在 Python 3 中,除了 Python 2 和 3 的兼容性之外,没有理由. 在 Python 2 中,有很多原因。
Python 2.x 故事:
在 Python 2.x(从 2.2 开始)中,有两种样式的类取决于
object
作为基类的存在与否:- “经典”样式类:它们没有
object
作为基类:
```py
class ClassicSpam: # no base class
… pass
ClassicSpam.bases
()
```- “新”样式类:它们直接或间接(例如从内置类型继承)
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 会为您插入它,所以它真的没有区别在幕后。
- “经典”样式类:它们没有