我正在使用一个 Python API,它希望我向它传递一个函数。但是,由于各种原因,我想向它传递一个方法,因为我希望函数根据它所属的实例表现出不同的行为。如果我向它传递一个方法,API 将不会使用正确的“self”参数调用它,所以我想知道如何将一个方法变成一个知道它属于什么“self”的函数。
我可以想到几种方法来做到这一点,包括使用 lambda 和闭包。我在下面包含了一些示例,但我想知道是否有标准机制可以实现相同的效果。
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>