■ コールバック関数とは
他の関数に引数として渡す関数のこと。
下記サイトのC言語の例が分かりやすい。
関数ポインタにコールバック関数を代入し、引数として渡している。
#include<stdio.h>
typedef void (* FUNC_POINTER)(char *);
// コーバック関数1
void callback1(char *s){
printf("%s\n",s);
}
// コールバック関数2
void callback2(char *s){
printf("[");
printf("%s",s);
printf("].\n");
}
// コールバック関数を呼び出す関数
void func(char *s,FUNC_POINTER p){
// コールバック関数を呼び出す
p(s);
}
int main(){
FUNC_POINTER p;
p = callback1;
// コールバック関数1を呼び出す
func("コーバック関数1",p);
p = callback2;
// コールバック関数2を呼び出す
func("コーバック関数2",p);
return 0;
}
実行結果。
コーバック関数1
[コーバック関数2].
■ Pythonの例
pythonでのコールバック関数の使用例。
コールバック関数を呼び出す関数はhandlerと記述されることが多いらしい↓
def handler(func,*args):
return func(*args)
流れとしては、
- ハンドラーを定義
- コールバック関数を定義
- 関数ポインタにコールバック関数を代入
- 関数ポインタをハンドラーの引数として渡す
# -*- coding: utf-8 -*-
def handler(func,*args):
return func(*args)
def callback1(message1):
print("%s" % message1)
def callback2(message1, message2):
print("%s, %s" % ( message1, message2) )
# main
if __name__ == "__main__":
# コールバック関数の代入
call = callback1
# ハンドラーの実行 : コールバック関数の呼び出し
handler(call, "message1")
# コールバック関数の代入
call = callback2
# ハンドラーの実行 : コールバック関数の呼び出し
handler(call, "message1", "message2")
実行結果。
message1
message1, message2
■ クラスを使う
関数ポインタの役割をする変数をクラス内のメンバ"func"に持たせているが、基本的にやってることは同じ。
- ハンドラーとして機能するクラスを定義
- 関数ポインタとして扱うメンバを定義
- ハンドラーとして機能するメソッドを定義
- コールバック関数を定義
- 関数ポインタにコールバック関数を代入
- 関数ポインタをハンドラーの引数として渡す
# -*- coding: utf-8 -*-
class Callbacker():
def __init__(self, func):
self.func = func
def handler(self, *args):
self.func(*args)
def callback1(message1):
print '%s' % message1
def callback2(message1, message2):
print("%s, %s" % ( message1, message2) )
# main
if __name__ == "__main__":
# コールバック関数の代入
callback = Callbacker(callback1)
print (type(callback.func))
print ("callback.func "),
print (callback.func)
print ("callback1 "),
print (callback1)
# ハンドラーの実行 : コールバック関数の呼び出し
callback.handler("message1")
print ("")
# コールバック関数の代入
callback.func = callback2
print (type(callback.func))
print ("callback.func "),
print (callback.func)
print ("callback2 "),
print (callback2)
# ハンドラーの実行 : コールバック関数の呼び出し
callback.handler("message1", "message2")
実行結果
<type 'function'>
callback.func <function callback1 at 0x7fcff9c8a9b0>
callback1 <function callback1 at 0x7fcff9c8a9b0>
message1
<type 'function'>
callback.func <function callback2 at 0x7fcff9c8ab18>
callback2 <function callback2 at 0x7fcff9c8ab18>
message1, message2
■ まとめ
コールバック関数とは他の関数に引数として渡す関数のこと。
基本は、
- ハンドラーを定義
- コールバック関数を定義
- 関数ポインタにコールバック関数を代入
- 関数ポインタをハンドラーの引数として渡す