为什么在Python中`object`类的实例是不可变的?
>>> 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__
,导致它的行为像语义不可变?选择这种设计的原因是什么?为什么在Python中`object`类的实例是不可变的?
具体地,原因是:在C中定义的类型的
实例不通过 默认具有__dict__属性。
文档注意到Python 2 is not very helpful在给一个解释,为什么你不能分配属性的object()
,但Python 3 provides a bit more information的文档:
返回一个新特征的对象。对象是所有类的基础。它具有所有Python类实例通用的方法。这个函数不接受任何参数。
注:对象没有一个
__dict__
,所以你不能指定任意属性的对象类的一个实例。
因此,你不能任意属性的object()
增加的原因似乎是因为一个事实,即object()
情况下,不具备__dict__
属性的实现,不是因为object()
实例是不可变:
>>> hasattr(object(), '__dict__')
False
>>>
另一个有趣的事情,但可能与手边的讨论无关,是虽然对象的实例可能没有__dict__
实现,但object
类本身具有:
>>> hasattr(object, '__dict__')
True
对于为什么问题一部分,我找不到为什么object()
没有任何__dict__
确切原因。可能是因为 - 正如@tdelany在评论中已经提到的 - 一个实现细节。如果你真的想要一个明确的答案,你应该ask Guido himself。
@SeanPianka号但我仍在寻找。我认为这将是有用的,以显示为什么你不能添加属性到一个'object()'。 –
因为它是内建类。 –
'object'是用C语言实现的,它的常见做法是扩展对象不需要额外的属性。考虑到常规的类实例'__dict__'是一个对象,'object'没有一个! – tdelaney
[Python:为什么\ _ \ _ dict \ _ \ _属性不在内置类实例中]可能重复(http://stackoverflow.com/questions/9502183/python-why-is-dict-attribute不在内置的类实例) –