動態綁定未綁定方法
在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中文網其他相關文章!