我試圖創建一個Python屬性,其中就地添加是通過不同的方法處理而不是檢索值,添加另一個值並重新分配。因此,對於一個對象o
上的屬性x
,如何爲Python屬性實現__iadd__
o.x += 5
應該工作不同於
o.x = o.x + 5
的o.x
值應該是在年底相同,以免混淆人們的預期,但我想使就地添加更高效。 (在現實中,操作時間比簡單的加法更多的時間。)
我的第一個想法是定義在類,
x = property(etc. etc.)
x.__iadd__ = my_iadd
但由於property
實現__slots__
這引發了一個AttributeError,想必?
我的下一次嘗試使用一個描述符對象:
class IAddProp(object):
def __init__(self):
self._val = 5
def __get__(self, obj, type=None):
return self._val
def __set__(self, obj, value):
self._val = value
def __iadd__(self, value):
print '__iadd__!'
self._val += value
return self
class TestObj(object):
x = IAddProp()
#x.__iadd__ = IAddProp.__iadd__ # doesn't help
>>> o = TestObj()
>>> print o.x
5
>>> o.x = 10
>>> print o.x
10
>>> o.x += 5 # '__iadd__!' not printed
>>> print o.x
15
正如你所看到的,特殊__iadd__
方法不叫。我無法理解這是爲什麼,儘管我猜測對象的__getattr__
在某種程度上繞過了它。
我該怎麼做?我沒有得到描述符的重點嗎?我需要一個元類嗎?
我有點困惑這個代碼片段。財產獲得者不應該返回什麼? – senderle 2012-08-16 14:48:22
@senderle噢,哎呀。對subclassing int的問題感到困惑。謝謝! – ecatmur 2012-08-16 14:54:26