这是一篇旧文章,但也许以下内容可能是关于编写和使用回调函数的额外说明,特别是如果您想知道它从哪里获取参数以及您是否可以访问它的返回值(如果没有办法从接受回调函数的函数中获取)。
下面的代码定义了一个类CallBack,它有两个回调方法(函数)my_callback_sum和my_callback_multiply。回调方法被输入到方法foo。
# understanding callback
class CallBack:
@classmethod
def my_callback_sum(cls, c_value1, c_value2):
value = c_value1 + c_value2
print(f'in my_callback_sum --> {c_value1} + {c_value2} = {value}')
cls.operator = '+'
return cls.operator, value
@classmethod
def my_callback_multiply(cls, c_value1, c_value2):
value = c_value1 * c_value2
print(f'in my_callback_multiply --> {c_value1} * {c_value2} = {value}')
cls.operator = '*'
return cls.operator, value
@staticmethod
def foo(foo_value, callback):
_, value = callback(10, foo_value)
# note foo only returns the value not the operator from callback!
return value
if __name__ == '__main__':
cb = CallBack()
value = cb.foo(20, cb.my_callback_sum)
print(f'in main --> {value} and the operator is {cb.operator}')
value = cb.foo(20, cb.my_callback_multiply)
print(f'in main --> {value} and the operator is {cb.operator}')
结果:
in my_callback_sum --> 10 + 20 = 30
in main --> 30 and the operator is +
in my_callback_multiply --> 10 * 20 = 200
in main --> 200 and the operator is *
您可以看到回调函数 c_value2 的一个值,它从 foo 中的参数 foo_value 获取,并在 main 中给出值 20,而 c_value1 在内部从 foo 获取值 10 的情况(如果 foo 是第三方导入模块的某种方法,例如 pyaudio,则可能不清晰可见)。
回调函数函数的返回值可以通过添加到类CallBack的命名空间中获取,本例中为cls.operator