【发布时间】:2012-08-12 20:22:28
【问题描述】:
我正在尝试创建一个 Python 属性,其中就地添加是由与检索值、添加另一个值和重新分配不同的方法处理的。因此,对于对象 o 上的属性 x,
o.x += 5
应该不同于
o.x = o.x + 5
o.x的值最后应该是一样的,以免混淆人们的期望,但是我想让in-place add更有效率。 (实际上这个操作比简单的加法要花更多的时间。)
我的第一个想法是在课堂上定义,
x = property(etc. etc.)
x.__iadd__ = my_iadd
但这引发了一个AttributeError,大概是因为property实现了__slots__?
我的下一次尝试使用描述符对象:
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__ 以某种方式绕过了它。
我该怎么做?我没有得到描述符的意义吗?我需要一个元类吗?
【问题讨论】:
标签: python properties descriptor magic-methods