非バインド メソッドを動的にバインドする
Python では、非バインド メソッドを呼び出すことなくインスタンスにバインドする必要がある状況によく遭遇します。これは、動的な GUI の作成や構造化された方法でのイベントの処理など、さまざまなシナリオで貴重なテクニックとなります。
プログラムの展開の問題
次のコードを考えてみましょう。スニペット:
<code class="python">class MyWidget(wx.Window): buttons = [ ("OK", OnOK), ("Cancel", OnCancel) ] def setup(self): for text, handler in MyWidget.buttons: b = wx.Button(parent, label=text).bind(wx.EVT_BUTTON, handler)</code>
ここでの問題は、ハンドラーがバインドされていないメソッドを表しており、プログラムがエラーでクラッシュすることです。これを解決するには、これらの非バインド メソッドを MyWidget の特定のインスタンスにバインドする方法が必要です。
記述子の力
Python のメソッドも記述子であり、それらを動的にバインドする方法。非バインド メソッドで特別な __get__ メソッドを呼び出すことで、バインド メソッドを取得できます:
<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>
バインド メソッドをクラスレベルの属性に割り当てることで、効果的にインスタンスにバインドできます:
<code class="python">setattr(self, handler.__name__, bound_handler)</code>
再利用可能なバインディング関数
この手法を使用すると、非バインド メソッドをバインドする再利用可能な関数を作成できます。
<code class="python">def bind(instance, func, as_name=None): """ Bind the function *func* to *instance*, with either provided name *as_name* or the existing name of *func*. The provided *func* should accept the instance as the first argument, i.e. "self". """ if as_name is None: as_name = func.__name__ bound_method = func.__get__(instance, instance.__class__) setattr(instance, as_name, bound_method) return bound_method</code>
この関数を使用すると、 、次のようにアンバインドされたメソッドをバインドできるようになりました:
<code class="python">bind(something, double) something.double() # returns 42</code>
以上がPython で非バインド メソッドを動的にバインドするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。