2011-05-06 197 views
35

這是一件讓我煩擾一陣子的東西。爲什麼我不能這樣做:將屬性添加到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! 

這是什麼規則?你能指點我一些描述嗎?

+1

btw,你應該使用'class Bar(object):'而不是class Bar():'所以你得到一個新式的類 – ThiefMaster 2011-05-06 07:15:21

回答

53

您可以將屬性添加到任何具有__dict__的對象。例如,

  • x = object()沒有它。
  • 字符串和其他簡單的內建對象也沒有它。
  • 使用__slots__的類也沒有它。
  • 使用class定義的類具有它,除非前面的陳述適用。

如果一個物體正在使用__slots__ /沒有__dict__,通常是爲了節省空間。例如,在str中有一個字典會是矯枉過正 - 想象一個非常短的字符串的膨脹量。

如果要測試給定對象是否具有__dict__,則可以使用hasattr(obj, '__dict__')

This也可能是有趣的閱讀:

一些對象,如內置的類型及其實例(列表,元組等)沒有__dict__。因此不能在其上設置用戶定義的屬性。

了Python的數據模型,包括__dict____slots__,等另一個有趣的文章是從Python參考this