概要
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
が呼ばれ続ける