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基于列表list实现的CRUD操作功能示例
Jan 05 Python
python3读取excel文件只提取某些行某些列的值方法
Jul 10 Python
便捷提取python导入包的属性方法
Oct 15 Python
Python操作json的方法实例分析
Dec 06 Python
Django Sitemap 站点地图的实现方法
Apr 29 Python
python计算二维矩形IOU实例
Jan 18 Python
Python多进程multiprocessing、进程池用法实例分析
Mar 24 Python
利用jupyter网页版本进行python函数查询方式
Apr 14 Python
jupyter lab文件导出/下载方式
Apr 22 Python
通过Python实现一个简单的html页面
May 16 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
MATLAB 如何求取离散点的曲率最大值
Apr 16 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
用libTemplate实现静态网页的生成
2006/10/09 PHP
php中使用cookie来保存用户登录信息的实现代码
2012/03/08 PHP
浅析echo(),print(),print_r(),return之间的区别
2013/11/27 PHP
WordPress中使主题支持小工具以及添加插件启用函数
2015/12/22 PHP
PHP 7.0.2 正式版发布
2016/01/08 PHP
(function(){})()的用法与优点
2007/03/11 Javascript
js parseInt("08")未指定进位制问题
2010/06/19 Javascript
javascript学习笔记(六)数据类型和JSON格式
2014/10/08 Javascript
JS数组的常见用法实例
2015/02/10 Javascript
完善的jquery处理机制
2016/02/21 Javascript
javascript实现多张图片左右无缝滚动效果
2017/03/22 Javascript
Vue2仿淘宝实现省市区三级联动
2020/04/15 Javascript
微信小程序使用modal组件弹出对话框功能示例
2017/11/29 Javascript
JS排序算法之希尔排序与快速排序实现方法
2017/12/12 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
2018/07/31 Javascript
NodeJs生成sitemap站点地图的方法示例
2019/06/11 NodeJs
vue实现虚拟列表功能的代码
2020/07/28 Javascript
el-form 多层级表单的实现示例
2020/09/10 Javascript
用Python写飞机大战游戏之pygame入门(4):获取鼠标的位置及运动
2015/11/05 Python
Python信息抽取之乱码解决办法
2017/06/29 Python
Python3解决棋盘覆盖问题的方法示例
2017/12/07 Python
对Python 网络设备巡检脚本的实例讲解
2018/04/22 Python
python转化excel数字日期为标准日期操作
2020/07/14 Python
基于python实现复制文件并重命名
2020/09/16 Python
CSS3 Flexbox中flex-shrink属性的用法示例介绍
2013/12/30 HTML / CSS
CSS3中Transition动画属性用法详解
2016/07/04 HTML / CSS
网络工程师面试(三木通信技术有限公司)
2013/06/05 面试题
GWT都有什么特性
2016/12/02 面试题
公务员的自我鉴定
2013/10/26 职场文书
酒店员工培训方案
2014/06/02 职场文书
公司门卫岗位职责范本
2014/07/08 职场文书
工商管理本科生求职信
2014/07/13 职场文书
医疗专业毕业生求职信
2014/08/28 职场文书
保送生自荐信范文
2015/03/26 职场文书
个人业务学习心得体会
2016/01/25 职场文书
Linux中各个目录的作用与内容
2022/06/28 Servers