我有两个类,一个具有“就地运算符”覆盖(例如+=
),另一个通过@property
. (注意:这从我的实际代码大大简化到重现问题的最低限度。)
class MyValue(object):
def __init__(self, value):
self.value = value
def __iadd__(self, other):
self.value += other
return self
def __repr__(self):
return str(self.value)
class MyOwner(object):
def __init__(self):
self._what = MyValue(40)
@property
def what(self):
return self._what
现在,当我尝试在暴露的属性上使用该运算符时:
>>> owner = MyOwner()
>>> owner.what += 2
AttributeError: can't set attribute
从我发现这是可以预料的,因为它试图将属性设置为owner
. 是否有某种方法可以防止将属性设置为新对象,同时仍允许我(就地)修改其背后的对象,或者这只是语言的一个怪癖?
(另请参阅this question,但我正尝试另辟蹊径,最好不要恢复到旧式类,因为最终我希望它可以与 Python 3 一起使用。)
与此同时,我用一种做同样事情的方法解决了这个问题。
class MyValue(object):
# ...
def add(self, other):
self.value += other
>>> owner = MyOwner()
>>> owner.what.add(2)
>>> print(owner.what)
42