関数を渡すことを期待する Python API を使用しています。ただし、さまざまな理由から、メソッドを渡したいと思います。これは、関数が属するインスタンスに応じて関数の動作が異なるようにするためです。メソッドを渡すと、API は正しい「自己」引数でそれを呼び出しません。そのため、メソッドを、それが属する「自己」を認識する関数に変換する方法を考えています。
これを行うには、ラムダやクロージャーを使用するなど、いくつかの方法が考えられます。以下にいくつかの例を示しますが、同じ効果を達成するための標準的なメカニズムがあるかどうか疑問に思っています。
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>