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__属性.
正如这个问题所述.
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自己.