將函數作爲參數傳遞給另一個函數,一共分爲4種情況:
- 將普通函數傳遞給普通函數
- 將普通函數傳遞給類成員函數
- 將類成員函數傳遞給普通函數
- 將類成員函數傳遞給類成員函數
這4種情況,在python中都支持。
#!/usr/bin/python3
class Person:
def __init__(self):
pass
def callback(self, data, param = None):
print(self.__class__.__name__ + " callback:")
print("data: " + str(data))
print("param: " + str(param))
def do_call_func(self, func, data, param = None):
print(self.__class__.__name__ + " do_call_func:")
func(data, param)
def do_call_class_func(self, func, data, obj, param = None):
print(self.__class__.__name__ + " do_call_class_func:")
func(obj, data, param)
def mycallback(data, param = None):
print("data: " + str(data))
print("param: " + str(param))
def do_call_func(func, data, param = None):
func(data, param)
def do_call_classfunc(func, data, obj, param = None):
func(obj, data, param)
person = Person()
#common func as callback pass to common func
do_call_func(mycallback, "1111111111", "xxx")
#common func as callback pass to class func
person.do_call_func(mycallback, "22222222")
#class func as callback pass to common func
do_call_classfunc(Person.callback, "333333333", person, None)
#class func as callback pass to class func
person.do_call_class_func(Person.callback, "44444444", person, None)
需要注意的是,如果回調函數是一個類成員函數,那麼調用該回調函數時,第一個參數必須是該類的一個對象,也就是說,必須將該類的對象,作爲一個普通參數,傳遞給調用該回調函數的函數。
比較拗口,上面的最後兩個調用,都是將person對象作爲第3個參數傳遞給了某個函數,某個函數內部又將該對像作爲回調函數的第一個參數來調用回調函數:
do_call_classfunc(Person.callback, "333333333", person, None)
person.do_call_class_func(Person.callback, "44444444", person, None)