2011-05-06 102 views
35

这是一件让我烦扰一阵子的东西。为什么我不能这样做:将属性添加到python对象

>>> a = "" 
>>> a.foo = 2 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
AttributeError: 'str' object has no attribute 'foo' 

......虽然我可以做到以下几点?

>>> class Bar(): 
...  pass 
... 
>>> a = Bar() 
>>> a.foo = 10 #ok! 

这是什么规则?你能指点我一些描述吗?

+1

btw,你应该使用'class Bar(object):'而不是class Bar():'所以你得到一个新式的类 – ThiefMaster 2011-05-06 07:15:21

回答

53

您可以将属性添加到任何具有__dict__的对象。例如,

  • x = object()没有它。
  • 字符串和其他简单的内建对象也没有它。
  • 使用__slots__的类也没有它。
  • 使用class定义的类具有它,除非前面的陈述适用。

如果一个物体正在使用__slots__ /没有__dict__,通常是为了节省空间。例如,在str中有一个字典会是矫枉过正 - 想象一个非常短的字符串的膨胀量。

如果要测试给定对象是否具有__dict__,则可以使用hasattr(obj, '__dict__')

This也可能是有趣的阅读:

一些对象,如内置的类型及其实例(列表,元组等)没有__dict__。因此不能在其上设置用户定义的属性。

了Python的数据模型,包括__dict____slots__,等另一个有趣的文章是从Python参考this