Python:绑定一个未绑定的方法?

在Python中,是否有一种方法来绑定一个未绑定的方法而不调用它?

我正在编写一个wxPython程序,对于某个类,我决定将所有button的数据组合到一起,形成一个类级别的元组列表,如下所示:

class MyWidget(wx.Window): buttons = [("OK", OnOK), ("Cancel", OnCancel)] # ... def Setup(self): for text, handler in MyWidget.buttons: # This following line is the problem line. b = wx.Button(parent, label=text).Bind(wx.EVT_BUTTON, handler) 

问题是,由于handler所有值都是未绑定的方法,所以我的程序在壮观的火焰中爆炸,我哭了。

我在网上寻找解决scheme似乎应该是一个相对简单,可解决的问题。 不幸的是我找不到任何东西。 现在,我正在使用functools.partial来解决这个问题,但是有谁知道是否有一种干净的感觉,健康的Pythonic方法将一个未绑定的方法绑定到一个实例,并继续传递而不调用它?

所有函数也是描述符 ,所以你可以通过调用__get__方法来绑定它们:

 bound_handler = handler.__get__(self, MyWidget) 

这里是R. Hettinger对描述符的优秀指南 。

这可以用types.MethodType干净地完成 。 例:

 import types def f(self): print self class C(object): pass meth = types.MethodType(f, C(), C) # Bind f to an instance of C print meth # prints <bound method Cf of <__main__.C object at 0x01255E90>> 

用自己创build闭包在技术上不会绑定函数,但它是解决相同(或非常相似)的潜在问题的替代方法。 这是一个简单的例子:

 self.method = (lambda self: lambda args: self.do(args))(self) 

这将绑定selfhandler

 bound_handler = lambda *args, **kwargs: handler(self, *args, **kwargs) 

这是通过将self作为函数的第一个parameter passing的。 object.function()只是function(object)语法糖。