向Python对象添加属性

42

这是一个一直困扰我的问题。为什么我不能这样做:

>>> 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
顺便提一下,你应该使用 class Bar(object): 而不是 class Bar(): 这样你就可以得到一个新式类。 - ThiefMaster
1个回答

60

您可以向任何具有 __dict__ 的对象添加属性。

  • 例如,x = object() 就没有 __dict__
  • 字符串和其他简单的内置对象也没有它。
  • 使用 __slots__ 的类也没有它。
  • 使用 class 定义的类有它,除非前面的情况适用。

如果一个对象使用了 __slots__/没有 __dict__,通常是为了节省空间。例如,在 str 中拥有一个字典就会浪费空间 —— 想象一下对于一个非常短的字符串来说所产生的膨胀量。

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

这篇文章 也可能很有趣:

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

另一篇关于 Python 数据模型(包括 __dict____slots__ 等)的有趣文章是来自 python 参考文献的这篇文章


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接