私は 2 つのクラスを持っています。1 つは「インプレース演算子」オーバーライド (たとえば+=
) を持ち、もう 1 つは を介して最初のインスタンスを公開します@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
プロパティを on に設定しようとしているので、これは予想されることowner
です。 プロパティを新しいオブジェクトに設定するのを防ぎながら、その背後にあるオブジェクトを (その場で)変更できるようにする方法はありますか、それとも言語の癖ですか?
(この質問も参照してください。ただし、最終的には Python 3 で動作するようにするため、できれば古いスタイルのクラスに戻さずに、別の方法で行こうとしています。)
それまでの間、同じことを行う方法でこれを回避しました。
class MyValue(object):
# ...
def add(self, other):
self.value += other
>>> owner = MyOwner()
>>> owner.what.add(2)
>>> print(owner.what)
42