给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的参考。