Python 使绑定方法像函数一样工作的最简单的方法是什么?
我正在使用一个pythonapi,它希望我向它传递一个函数。但是,出于各种原因,我希望向它传递一个方法,因为我希望函数根据它所属的实例表现出不同的行为。如果我向它传递一个方法,API将不会使用正确的“self”参数调用它,因此我想知道如何将一个方法转换为一个知道它属于什么“self”的函数 有几种方法可以实现这一点,包括使用lambda和闭包。我在下面列举了一些例子,但我想知道是否有一个标准的机制可以达到同样的效果Python 使绑定方法像函数一样工作的最简单的方法是什么?,python,function,methods,closures,Python,Function,Methods,Closures,我正在使用一个pythonapi,它希望我向它传递一个函数。但是,出于各种原因,我希望向它传递一个方法,因为我希望函数根据它所属的实例表现出不同的行为。如果我向它传递一个方法,API将不会使用正确的“self”参数调用它,因此我想知道如何将一个方法转换为一个知道它属于什么“self”的函数 有几种方法可以实现这一点,包括使用lambda和闭包。我在下面列举了一些例子,但我想知道是否有一个标准的机制可以达到同样的效果 class A(object): def hello(self, sal
class A(object):
def hello(self, salutation):
print('%s, my name is %s' % (salutation, str(self)))
def bind_hello1(self):
return lambda x: self.hello(x)
def bind_hello2(self):
def hello2(*args):
self.hello(*args)
return hello2
>>> a1, a2 = A(), A()
>>> a1.hello('Greetings'); a2.hello('Greetings')
Greetings, my name is <__main__.A object at 0x71570>
Greetings, my name is <__main__.A object at 0x71590>
>>> f1, f2 = a1.bind_hello1(), a2.bind_hello1()
>>> f1('Salutations'); f2('Salutations')
Salutations, my name is <__main__.A object at 0x71570>
Salutations, my name is <__main__.A object at 0x71590>
>>> f1, f2 = a1.bind_hello2(), a2.bind_hello2()
>>> f1('Aloha'); f2('Aloha')
Aloha, my name is <__main__.A object at 0x71570>
Aloha, my name is <__main__.A object at 0x71590>
A类(对象):
def你好(自我问候):
打印(“%s,我的名字是%s%”(称呼,str(self)))
def bind_hello1(自身):
返回lambda x:self.hello(x)
def bind_hello2(自身):
def hello2(*参数):
self.hello(*args)
返回hello2
>>>a1,a2=A(),A()
>>>你好(“问候”);你好(‘问候’)
你好,我的名字是
你好,我的名字是
>>>f1,f2=a1.bind_hello1(),a2.bind_hello1()
>>>f1(“问候语”);f2(‘问候语’)
问候,我的名字是
问候,我的名字是
>>>f1,f2=a1.bind_hello2(),a2.bind_hello2()
>>>f1(“阿罗哈”);f2(‘阿罗哈’)
阿罗哈,我的名字是
阿罗哈,我的名字是
传入绑定到实例的方法是否有效?如果是这样,你不必做任何特别的事情
In [2]: class C(object):
...: def method(self, a, b, c):
...: print a, b, c
...:
...:
In [3]: def api_function(a_func):
...: a_func("One Fish", "Two Fish", "Blue Fish")
...:
...:
In [4]: c = C()
In [5]: api_function(c.method)
One Fish Two Fish Blue Fish
你可能想澄清你的问题。正如Ryan指出的
def callback(fn):
fn('Welcome')
callback(a1.hello)
callback(a2.hello)
将导致使用正确的self
绑定、a1
或a2
调用hello
。如果您没有体验到这一点,那么就有严重的问题,因为Python就是这样工作的
从你所写的判断,你似乎想要的是绑定参数——换句话说。你可以在各地找到例子,但根据我的口味,它的外观是最好的
class curry:
def __init__(self, fun, *args, **kwargs):
self.fun = fun
self.pending = args[:]
self.kwargs = kwargs.copy()
def __call__(self, *args, **kwargs):
if kwargs and self.kwargs:
kw = self.kwargs.copy()
kw.update(kwargs)
else:
kw = kwargs or self.kwargs
return self.fun(*(self.pending + args), **kw)
f1 = curry(a1.hello, 'Salutations')
f1() # == a1.hello('Salutations')
维基百科也这么称呼他们。“使用curry的实际动机是,函数通常是通过向curry函数(通常称为部分应用程序)提供一些但不是全部参数而获得的。”