为什么`object`类的实例在Python中是不可变的?

Sea*_*nka 10 python attributes immutability

>>> a = object()
>>> a.x = 5
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'object' object has no attribute 'x'
>>> b = lambda:0
>>> b.x = 5
>>> b.x
5
Run Code Online (Sandbox Code Playgroud)

为什么object类的实例没有a __dict__,导致它在语义上不可变?选择这个设计的原因是什么?

具体来说,原因:

在C中定义的类型实例默认情况下没有__dict__属性.

正如这个问题所述.

Chr*_*ean 7

Python 2的文档对于解释为什么不能为其分配属性没有多大帮助object(),但Python 3的文档提供了更多信息:

返回一个新的无特征对象.object是所有类的基础.它具有所有Python类实例共有的方法.此函数不接受任何参数.

注意:对象没有 __dict__,因此您无法将任意属性分配给对象类的实例.

因此,您无法向您添加任意属性的原因object()似乎是因为object()实例没有该__dict__属性的实现,而不是因为object()实例是不可变的:

>>> hasattr(object(), '__dict__')
False
>>>
Run Code Online (Sandbox Code Playgroud)

另一个有趣的事情,但可能与手头的讨论无关,就是虽然对象的实例可能没有__dict__实现,但object类本身会:

>>> hasattr(object, '__dict__')
True
Run Code Online (Sandbox Code Playgroud)

至于为什么部分问题,我找不到任何确切的原因,为什么object()没有__dict__.可能是因为 - 正如@tdelany在评论中已经提到的那样 - 一个实现细节.如果你真的想要一个明确的答案,你应该问问Guido自己.

  • `object`是用C实现的,它的共同点是扩展对象不需要额外的属性.考虑到常规类实例`__dict__`是一个对象,它并不奇怪``对象'没有一个! (3认同)
  • @leaf - 这是一个好地方:https://hg.python.org/cpython/file/tip/Include/object.h.它将向您显示实施的详细信息. (2认同)