以下を参照させていただき、
コールバック関数の使い方をわかったつもりだったが、
事前にコールバック関数を登録し、後からそれを呼び出す
というやり方はどうやるんだろうと思って以下を試した
# テスト用function
def function1():
return 123
# classの定義
class HandlerClass:
def __init__(self, name):
self.name = name
self.callback_function = None
def register_callback_function(self, func):
self.callback_function = func
def call_callback_function(self):
if self.callback_function == None:
return None
return self.callback_function()
# インスタンスを生成
HandlerClass = HandlerClass("Sample")
# 事前にコールバック関数を登録
HandlerClass.register_callback_function( function1 )
# 登録したコールバック関数を呼び出す
result1 = HandlerClass.call_callback_function()
print(result1)
実行
$ python test.py
123
できる事はできるが、これは正しい所作なのだろうか。。。
(引数を加えたい場合はどうするのが正しいのだろうか。。。)
追記
クラスのfunctionを、別クラスのcallback関数に指定して呼ぶことも可能ではある
(これは正しい所作なのだろうか。。。)
# テスト用classの定義
class TestClass:
def __init__(self, name):
self.name = name
def function1(self):
print(self.name)
return 123
# classの定義
class HandlerClass:
def __init__(self, name):
self.name = name
self.callback_function = None
def register_callback_function(self, func):
self.callback_function = func
def call_callback_function(self):
if self.callback_function == None:
return None
return self.callback_function()
# インスタンスを生成
TestClass = TestClass("TestClass")
HandlerClass = HandlerClass("HandlerClass")
# 事前にコールバック関数を登録
HandlerClass.register_callback_function(TestClass.function1)
# 登録したコールバック関数を呼び出す
result1 = HandlerClass.call_callback_function()
print(result1)
$ python test.py
TestClass
123
もちろんアドレスを一度dictに格納してから登録することも可能
## アドレスを一度dictに格納してから登録することも可能
from collections import defaultdict
d = defaultdict(int)
# インスタンスを生成
d["class_addr"] = TestClass.function1
func = d["class_addr"]
# 事前にコールバック関数を登録
HandlerClass.register_callback_function(func)
# 登録したコールバック関数を呼び出す
result1 = HandlerClass.call_callback_function()
print(result1)
$ python test.py
TestClass
123