首頁 >後端開發 >Python教學 >如何在Python中綁定未綁定的方法而不呼叫它們?

如何在Python中綁定未綁定的方法而不呼叫它們?

Barbara Streisand
Barbara Streisand原創
2024-10-30 01:22:03639瀏覽

How to Bind Unbound Methods in Python Without Invoking Them?

解開棘手結:無縫綁定未綁定方法

在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>

這裡,handler 代表一個未綁定的方法,導致運行時錯誤。雖然 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn