2016-11-28 149 views
9
>>> 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__属性。

this question.

+0

[Python:为什么\ _ \ _ dict \ _ \ _属性不在内置类实例中]可能重复(http://stackoverflow.com/questions/9502183/python-why-is-dict-attribute不在内置的类实例) –

回答

7

文档注意到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

+0

@SeanPianka号但我仍在寻找。我认为这将是有用的,以显示为什么你不能添加属性到一个'object()'。 –

+0

因为它是内建类。 –

+3

'object'是用C语言实现的,它的常见做法是扩展对象不需要额外的属性。考虑到常规的类实例'__dict__'是一个对象,'object'没有一个! – tdelaney

相关问题