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

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

Barbara Streisand
Barbara Streisandオリジナル
2024-10-30 01:22:03633ブラウズ

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

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。