Python回调函数用法实例详解


Posted in Python onJuly 02, 2015

本文实例讲述了Python回调函数用法。分享给大家供大家参考。具体分析如下:

一、百度百科上对回调函数的解释:

回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的实现方直接调用,而是在特定的事件或条件发生时由另外的一方调用的,用于对该事件或条件进行响应。

二、什么是回调:

软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。同步调用是一种阻塞式调用,调用方要等待对方执行完毕才返回,它是一种单向调用;回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础,因此,下面我们着重讨论回调机制在不同软件架构中的实现。

三、一个小例子:

#call.py 
import called 
def callback(): 
  print "in callback" 
def main(): 
  #called.test() 
  called.test_call(callback) 
  print "in call.py" 
main() 
#called.py 
''''' 
def test(): 
  print "in called.py test()" 
''' 
def test_call(p_call): 
  print "in called.py test_call()" 
  p_call() 
joe@joe:~/test/python$ python call.py 
in called.py test_call() 
in callback 
in call.py 
joe@joe:~/test/python$

网上搜到的一个面向对象实现的例子:

当你要加入回调(Callback)功能的时候,代码往往会偏重于回调的实现而不是问题本身了。一个解决方法就是实现一个通用的基础类来解决回调的需求,然后再来实现你为某个事件(Event)所绑定(Binding)的方法(Method)。

代码如下:

class CallbackBase: 
  def __init__(self): 
 self.__callbackMap = {} 
 for k in (getattr(self, x) for x in dir(self)): 
   if hasattr(k, "bind_to_event"): 
 self.__callbackMap.setdefault(k.bind_to_event, []).append(k) 
   elif hasattr(k, "bind_to_event_list"): 
 for j in k.bind_to_event_list: 
   self.__callbackMap.setdefault(j, []).append(k) 
  ## staticmethod is only used to create a namespace 
  @staticmethod 
  def callback(event): 
 def f(g, ev = event): 
   g.bind_to_event = ev 
   return g 
 return f 
  @staticmethod 
  def callbacklist(eventlist): 
 def f(g, evl = eventlist): 
   g.bind_to_event_list = evl 
   return g 
 return f 
  def dispatch(self, event): 
 l = self.__callbackMap[event] 
 f = lambda *args, **kargs: \ 
   map(lambda x: x(*args, **kargs), l) 
 return f 
## Sample 
class MyClass(CallbackBase): 
  EVENT1 = 1 
  EVENT2 = 2 
  @CallbackBase.callback(EVENT1) 
  def handler1(self, param = None): 
 print "handler1 with param: %s" % str(param) 
 return None 
  @CallbackBase.callbacklist([EVENT1, EVENT2]) 
  def handler2(self, param = None): 
 print "handler2 with param: %s" % str(param) 
 return None 
  def run(self, event, param = None): 
 self.dispatch(event)(param) 
if __name__ == "__main__": 
  a = MyClass() 
  a.run(MyClass.EVENT1, 'mandarina') 
  a.run(MyClass.EVENT2, 'naranja')

这里有一个类,它有两个事件(EVENT1和EVENT2)和两个处理函数(handler)。第一个处理函数handler1注册了EVENT1,而第二个处理函数handler2当EVENT1或者EVENT2发生的时候都会执行(即注册了全部的事件)。

运行函数(run)在MyClass的主循环中,它会将对应的事件派送(dispatch)出去。这(这里指dispatch函数)会返回一个函数,我们可以把所有需要传给这个函数的参数列表传给它。这个函数运行结束会返回一个列表(list),列表中是所有的返回值。

也许,使用Metaclass能够实现的更优雅一些吧。

希望本文所述对大家的Python程序设计有所帮助。

Python 相关文章推荐
python 实现堆排序算法代码
Jun 05 Python
Python对文件操作知识汇总
May 15 Python
python利用拉链法实现字典方法示例
Mar 25 Python
Python实现动态加载模块、类、函数的方法分析
Jul 18 Python
Python中scatter函数参数及用法详解
Nov 08 Python
python爬虫之线程池和进程池功能与用法详解
Aug 02 Python
Python利用逻辑回归模型解决MNIST手写数字识别问题详解
Jan 14 Python
使用python+poco+夜神模拟器进行自动化测试实例
Apr 23 Python
iPython pylab模式启动方式
Apr 24 Python
如何用Anaconda搭建虚拟环境并创建Django项目
Aug 02 Python
python全栈开发语法总结
Nov 22 Python
python读取mnist数据集方法案例详解
Sep 04 Python
在Python中marshal对象序列化的相关知识
Jul 01 #Python
python保存字符串到文件的方法
Jul 01 #Python
python选择排序算法实例总结
Jul 01 #Python
python实现的希尔排序算法实例
Jul 01 #Python
python获取一组汉字拼音首字母的方法
Jul 01 #Python
python的keyword模块用法实例分析
Jun 30 #Python
Python实现监控程序执行时间并将其写入日志的方法
Jun 30 #Python
You might like
解析PHP正则提取或替换img标记属性
2013/06/26 PHP
php顺序查找和二分查找示例
2014/03/27 PHP
PHP实现一个简单url路由功能实例
2016/11/05 PHP
PHP实现负载均衡下的session共用功能
2018/04/17 PHP
js加解密 脚本解密
2008/02/22 Javascript
获取URL地址中的文件名和参数的javascript代码
2009/09/02 Javascript
firefox下对ajax的onreadystatechange的支持情况分析
2009/12/14 Javascript
html组件不可输入(只读)同时任何组件都有效
2013/04/01 Javascript
完美解决AJAX跨域问题
2013/11/01 Javascript
js判断字符长度以及中英文数字等
2013/12/31 Javascript
jQuery实现下拉框功能实例代码
2016/05/06 Javascript
基于jquery二维码生成插件qrcode
2017/01/07 Javascript
Bootstrap 设置datetimepicker在屏幕上面弹出设置方法
2017/03/21 Javascript
javascript 中null和undefined区分和比较
2017/04/19 Javascript
jQuery EasyUI开发技巧总结
2017/09/26 jQuery
简述Angular 5 快速入门
2017/11/04 Javascript
如何利用@angular/cli V6.0直接开发PWA应用详解
2018/05/06 Javascript
了解JavaScript函数中的默认参数
2019/05/30 Javascript
解决Vue @submit 提交后不刷新页面问题
2020/07/18 Javascript
解决vue数据不实时更新的问题(数据更改了,但数据不实时更新)
2020/10/27 Javascript
在Python的Django框架中获取单个对象数据的简单方法
2015/07/17 Python
pandas数据预处理之dataframe的groupby操作方法
2018/04/13 Python
解决Python pandas df 写入excel 出现的问题
2018/07/04 Python
对python中的 os.mkdir和os.mkdirs详解
2018/10/16 Python
python 自动轨迹绘制的实例代码
2019/07/05 Python
深入了解Django View(视图系统)
2019/07/23 Python
使用python os模块复制文件到指定文件夹的方法
2019/08/22 Python
简单了解python中的与或非运算
2019/09/18 Python
Exception类的常用方法
2012/06/16 面试题
护士岗位职责
2014/02/16 职场文书
分层教学实施方案
2014/03/19 职场文书
鼓舞士气的口号
2014/06/16 职场文书
2016年清明节期间群众祭祀活动工作总结
2016/04/01 职场文书
导游词之丽江普济寺
2019/10/22 职场文书
十大冰系宝可梦排名,颜值最高的阿罗拉九尾,第三使用率第一
2022/03/18 日漫
nginx location 带斜杠【 / 】与不带的区别
2022/04/13 Servers