私は「インプレース演算子」オーバーライド(たとえば+=
)を持つクラスと、最初のインスタンスを@property
に公開するクラスの2つのクラスを持っています。 (注:これは非常に問題を再現最小限に私の実際のコードから簡略化されです。)読み取り専用のプロパティを変更可能にするにはどうすればよいですか?
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
その他の回避策: 'TEMP = owner.whatを。 temp + = 2'、[owner.what] [0] + = 2'のようになります。 –
私はユーザーコードから「ハッキーな」部分を保ちたいので、@ Martijnの答えに行くつもりですが、アイデアに感謝します。彼らは他のもののために便利になるかもしれません。私は彼らが非常に簡潔であることを好む(特に第2::)。 – criptych