给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! 

这里的规则是什么? 请您指出一些描述?

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

  • x = object()没有它,例如。
  • string和其他简单的内build对象也没有它。
  • 使用__slots__类也没有它。
  • 除非前面的语句适用,否则用类定义的class有它。

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

如果你想testing给定的对象是否有__dict__ ,你可以使用hasattr(obj, '__dict__')

这也可能是有趣的阅读:

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

另外一篇关于Python数据模型的有趣文章,包括__dict____slots__等,来自python的参考。