如何在 Python 中動態綁定未綁定的方法?

Barbara Streisand
發布: 2024-10-30 14:21:03
原創
556 人瀏覽過

How Can You Dynamically Bind Unbound Methods in Python?

動態綁定未綁定方法

在Python中,我們經常遇到需要將未綁定方法綁定到實例而不調用它的情況。這在各種場景中都是一項有價值的技術,例如創建動態 GUI 或以結構化方式處理事件。

程式爆炸問題

考慮以下程式碼snippet:

<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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!