解開棘手結:無縫綁定未綁定方法
在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中文網其他相關文章!