向python对象添加属性

时间:2011-05-06 07:07:35

标签: python object attributes

这件事让我感到困扰了一段时间。为什么我不能这样做:

>>> 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 个答案:

答案 0 :(得分:53)

您可以将属性添加到具有__dict__

的任何对象
    例如,
  • x = object()没有它。
  • 字符串和其他简单的内置对象也没有它。
  • 使用__slots__的类也没有。
  • 使用class定义的类具有它,除非之前的声明适用。

如果某个对象正在使用__slots__ /没有__dict__,则通常可以节省空间。例如,在一个str中,设置一个字典会有点过分 - 想象一下非常短的字符串的膨胀量。

如果您想测试某个对象是否有__dict__,您可以使用hasattr(obj, '__dict__')

This可能也很有趣:

  

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

另一篇关于Python数据模型的有趣文章,包括__dict____slots__等,来自python引用的this