概要
Pythonのクラスに関数を登録するときの挙動
うまく行かない場合
class Hoge:
def __init__(self):
self.func = lambda: None
self.trigger = self.func
def hello():
print('hello')
hoge = Hoge()
hoge.func = hello
hoge.trigger() # 出力なし
hoge.trigger()をするとhelloが実行されてほしいが、実際には何も出力されない
うまくいく場合
class Hoge:
def __init__(self):
self.func = lambda: None
self.trigger = lambda: self.func() # 変更箇所
def hello():
print('hello')
hoge = Hoge()
hoge.func = hello
hoge.trigger() # 出力: hello
解説
self.trigger = self.funcだと関数ポインタが渡されるのであとからself.funcを変更しても最初に指定したlambda: Noneが呼ばれ続ける