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

时间:2016-11-28 21:06:25

标签: 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

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

具体来说,为什么:

  

在C中定义的类型实例没有__dict__属性   默认值。

this question.

所述

1 个答案:

答案 0 :(得分:7)

Python 2 is not very helpful的文档解释了为什么您无法为object()分配属性,但Python 3 provides a bit more information的文档:

  

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

     

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

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

object()

另一个有趣的事情,但可能与手头的讨论无关,是虽然对象的实例可能没有>>> hasattr(object(), '__dict__') False >>> 实现,但__dict__类本身作用:

object

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