这件事让我感到困扰了一段时间。为什么我不能这样做:
>>> 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!
这里的规则是什么?你能指点我一些描述吗?
答案 0 :(得分:53)
您可以将属性添加到具有__dict__
。
x = object()
没有它。__slots__
的类也没有。class
定义的类具有它,除非之前的声明适用。如果某个对象正在使用__slots__
/没有__dict__
,则通常可以节省空间。例如,在一个str
中,设置一个字典会有点过分 - 想象一下非常短的字符串的膨胀量。
如果您想测试某个对象是否有__dict__
,您可以使用hasattr(obj, '__dict__')
。
This可能也很有趣:
某些对象(例如内置类型及其实例(列表,元组等))没有
__dict__
。因此,无法在其上设置用户定义的属性。
另一篇关于Python数据模型的有趣文章,包括__dict__
,__slots__
等,来自python引用的this。