Python では、各タプルがボタンとそれに対応するイベント ハンドラーを表すクラスレベルのタプルのリストを定義すると、データ構成を強化できます。ただし、実行をトリガーせずに非バインド メソッドをインスタンスにバインドすると、問題が生じる可能性があります。
この問題は、イベント ハンドラーの値が非バインド メソッドである場合に発生し、実行時エラーが発生します。 functools.partial は回避策を提供しますが、より Python 的なアプローチは、関数の記述子の動作を利用することです。
関数を含む記述子には、呼び出されると関数をインスタンスにバインドする __get__ メソッドがあります。このメソッドを利用すると、次のように非バインド メソッドをバインドできます。
<code class="python">bound_handler = handler.__get__(self, MyWidget)</code>
この手法により、非バインド メソッド ハンドラーを呼び出すことなく MyWidget インスタンスに効果的にバインドできます。
あるいは、再利用可能な関数をカプセル化することもできます。このバインディング ロジック:
<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">something = Thing(21) def double(self): return 2 * self.val bind(something, double) something.double() # returns 42</code>
以上が呼び出しをトリガーせずに Python で非バインド メソッドをバインドするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。