Gordian Knot のバインド解除: 非バインド メソッドをシームレスにバインド
Python では、非バインド メソッドを呼び出さずにバインドすると、コーディング上の問題が発生する可能性があります。次のシナリオを考えてみましょう:
<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>
ここで、ハンドラーはバインドされていないメソッドを表しており、実行時エラーが発生します。 functools.partial は回避策を提供しますが、Python の固有の記述子機能は洗練された解決策を提供します。
記述子の力を明らかにする
Python のすべての関数は、固有の記述子プロパティを持っています。 __get__ メソッドを利用することで、非バインド メソッドをインスタンスにバインドできます。
<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>
この手法により、実行をトリガーせずに非バインド メソッドをバインドできます。
包括的な例
説明のために、カスタム バインド関数を実装してみましょう。
<code class="python">def bind(instance, func, as_name=None): 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">class Thing: def __init__(self, val): self.val = val something = Thing(21) def double(self): return 2 * self.val bind(something, double) something.double() # returns 42</code>
記述子の力を利用して、バインドされていないメソッドを簡単にバインドし、Python の原則に妥協することなく無数のコーディングの可能性を解き放ちます。
以上がPython で非バインド メソッドを呼び出さずにバインドする方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。