首页  >  文章  >  后端开发  >  如何在Python中绑定未绑定的方法而不调用它们?

如何在Python中绑定未绑定的方法而不调用它们?

Barbara Streisand
Barbara Streisand原创
2024-10-30 01:22:03546浏览

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