我有两个类,一个是"就地操作符"覆盖(比如说+=),另一个是通过a公开第一个实例@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
Run Code Online (Sandbox Code Playgroud)
现在,当我尝试在公开的属性上使用该运算符时:
>>> owner = MyOwner()
>>> owner.what += 2
AttributeError: can't set attribute
Run Code Online (Sandbox Code Playgroud)
从我发现这是预期的,因为它试图设置属性owner. 有没有办法防止将属性设置为新对象,同时仍然允许我(就地)修改它后面的对象,或者这只是语言的怪癖?
(另请参阅此问题,但我试图采用其他方式,最好不要回到旧式类,因为最终我希望它能与Python 3一起使用.)
与此同时,我用一种方法做了同样的事情.
class MyValue(object):
# ...
def add(self, other):
self.value += other
>>> …Run Code Online (Sandbox Code Playgroud) python properties new-style-class python-2.7 augmented-assignment