ホームページ > バックエンド開発 > Python チュートリアル > Python で非バインド メソッドを呼び出さずにバインドする方法

Python で非バインド メソッドを呼び出さずにバインドする方法

Barbara Streisand
リリース: 2024-10-30 01:22:03
オリジナル
653 人が閲覧しました

How to Bind Unbound Methods in Python Without Invoking Them?

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

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