在Python中,回调函数是一种常见的编程模式,它允许一个函数(通常称为回调函数)被传递给另一个函数,并在适当的时候被调用。回调函数通常用于异步编程,允许程序在等待某些操作完成时继续执行其他任务。
同步回调函数
def my_callback(input):
print("function my_callback was called with %s input" % input)
def caller(input, func):
func(input)
for i in range(5):
caller(i, my_callback)
异步回调函数
def handler(x):
print("The result is %s" % x)
def add(a, b):
return a + b
def task_async(func, args, callback=None):
result = func(*args)
callback(result)
if __name__ == "__main__":
task_async(add, (2, 3), callback=handler)
带外部状态的回调函数
class RequestHandler:
def __init__(self):
self.sequence = 0
def handler(self, result):
self.sequence += 1
print("[{}] Got: {}".format(self.sequence, result))
def add(a, b):
return a + b
def task_async(func, args, *, callback=None):
result = func(*args)
callback(result)
if __name__ == "__main__":
handler_instance = RequestHandler()
task_async(add, (2, 3), callback=handler_instance.handler)
使用装饰器实现回调
class BaseHandler(object):
def crawl(self, url, kwargs):
if kwargs.get('callback'):
callback = kwargs['callback']
if isinstance(callback, basestring) and hasattr(self, callback):
func = getattr(self, callback)
elif hasattr(callback, 'im_self') and callback.im_self is self:
func = callback
resp = requests.get(url)
return func(resp)
class Anjuke(BaseHandler):
def on_start(self):
self.crawl(start_url, callback=self.index_url)
def index_url(self, response):
print(response.text)
a = Anjuke()
print(a.on_start())
生成随机数并打印的回调函数示例
import random as rd
def newRN(fn):
ns = []
for i in range(10):
n = round(rd.random(), 2)
ns.append(n)
fn(ns)
def abc(*args):
print("生成数据成功")
print(args)
newRN(abc)
这些示例展示了如何在Python中实现不同类型的回调函数,包括同步和异步回调,以及如何使用装饰器来简化回调函数的实现。回调函数是Python中一个强大的特性,可以用于多种场景,包括事件处理、异步编程等