Python で非バインド メソッドを動的にバインドするにはどうすればよいですか?

Barbara Streisand
リリース: 2024-10-30 14:21:03
オリジナル
601 人が閲覧しました

How Can You Dynamically Bind Unbound Methods in Python?

非バインド メソッドを動的にバインドする

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

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