解开棘手结:无缝绑定未绑定方法
在 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中文网其他相关文章!