3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Pythonにてコールバック関数を使うお試し(クラスからcallback関数を使う版のお試し)

Last updated at Posted at 2022-02-11

以下を参照させていただき、

Pythonにてコールバック関数を使う

コールバック関数の使い方をわかったつもりだったが、
事前にコールバック関数を登録し、後からそれを呼び出すというやり方はどうやるんだろうと思って以下を試した

# テスト用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

参考

Pythonにてコールバック関数を使う

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?