__iadd__()
メソッドを定義したタイプの読み取り専用プロパティで+=
演算子を使用しているときに、Can't set attribute
エラーが発生します。セッターを持たないプロパティで+ =演算子を使用するにはどうすればよいですか?
簡体(しかし、実行可能な)私のコードのバージョン:
class Emitter(list):
def __iadd__(self, other):
self.append(other)
return self
class Widget:
def __init__(self):
self._on_mouseenter = Emitter()
@property
def on_mouseenter(self): return self._on_mouseenter
my_widget = Widget()
my_widget.on_mouseenter += lambda source: print("on_mouseenter!")
最後の行がエラーを生成します。
@on_mouseenter.setter
def on_mouseenter(self, value): pass
(Runnableをhttps://repl.it/EONf/0で)
この動作は、2つのアカウントに奇妙なようだ:私はWidget
の定義に次の行を追加する場合には消えます。まず、Pythonがオブジェクトを参照渡しすると思ったので、なぜプロパティを読み込み可能にする必要がありますか?そして第二に、私のダミーセッターはどういう仕組みになっていますか?
答えは問題を説明していますが、 'self.on_mouseenter = Emitter()'を直接定義してそのプロパティを避けることができます。 –
用語には注意してください。 Pythonはオブジェクトへの参照を渡しますが、「参照渡し」は微妙に異なるものを指します。 Pythonがしていることは実際には良い標準名を持っていません。 「オブジェクトで呼び出す」「共有で呼び出す」とか、Javaの人々が「値渡しだが渡される値は参照」と呼ぶ人もいます。 – user2357112
@BenHoyt:プロパティを読み取り専用にして、ユーザーコードで上書きできないようにしたかったのです。それはPythonの反パターンですか? – JPNotADragon