呼び出しをトリガーせずに Python で非バインド メソッドをバインドするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-02 11:26:02
オリジナル
806 人が閲覧しました

How Can I Bind Unbound Methods in Python Without Triggering Invocation?

呼び出しを行わずに非バインド メソッドをバインドする

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート