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中日期和时间格式化输出的方法小结
Mar 19 Python
python中根据字符串调用函数的实现方法
Jun 12 Python
Python实现曲线拟合操作示例【基于numpy,scipy,matplotlib库】
Jul 12 Python
解决python selenium3启动不了firefox的问题
Oct 13 Python
Python Opencv实现图像轮廓识别功能
Mar 23 Python
PyQt5实现QLineEdit添加clicked信号的方法
Jun 25 Python
python新式类和经典类的区别实例分析
Mar 23 Python
python异常处理、自定义异常、断言原理与用法分析
Mar 23 Python
Python super()方法原理详解
Mar 31 Python
完美解决keras 读取多个hdf5文件进行训练的问题
Jul 01 Python
Python接口自动化测试框架运行原理及流程
Nov 30 Python
Python中OpenCV实现简单车牌字符切割
Jun 11 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中使用array函数新建一个数组
2015/11/19 PHP
PHP面向对象编程之深入理解方法重载与方法覆盖(多态)
2015/12/24 PHP
php中__toString()方法用法示例
2016/12/07 PHP
精选的10款用于构建良好易用性网站的jQuery插件
2011/01/23 Javascript
js判断是否为数组的函数: isArray()
2011/10/30 Javascript
CheckBoxList多选样式jquery、C#获取选择项
2013/09/06 Javascript
Javascript模拟加速运动与减速运动代码分享
2014/12/11 Javascript
jQuery简单实现验证邮箱格式
2015/07/15 Javascript
基于javascript实现tab选项卡切换特效调试笔记
2016/03/30 Javascript
js enter键激发事件实例代码
2016/08/17 Javascript
深入学习js瀑布流布局
2016/10/14 Javascript
js通过classname来获取元素的方法
2016/11/24 Javascript
原生Javascript插件开发实践
2017/01/18 Javascript
jQuery实现动态添加、删除按钮及input输入框的方法
2017/04/27 jQuery
详解Vue中过度动画效果应用
2017/05/25 Javascript
详解express与koa中间件模式对比
2017/08/07 Javascript
浅谈Koa服务限流方法实践
2017/10/23 Javascript
ajax请求data遇到的问题分析
2018/01/18 Javascript
详解vue axios二次封装
2018/07/22 Javascript
微信小程序 如何获取网络状态
2019/07/26 Javascript
vue如何在用户要关闭当前网页时弹出提示的实现
2020/05/31 Javascript
JS如何在不同平台实现多语言方式
2020/07/16 Javascript
python smtplib模块自动收发邮件功能(二)
2018/05/22 Python
python命令行参数用法实例分析
2019/06/25 Python
如何在python中写hive脚本
2019/11/08 Python
Python开发之身份证验证库id_validator验证身份证号合法性及根据身份证号返回住址年龄等信息
2020/03/20 Python
Vans荷兰官方网站:美国南加州的原创极限运动潮牌
2018/01/23 全球购物
Feelunique澳大利亚:欧洲的化妆品零售电商
2019/12/18 全球购物
颇特女士香港官网:NET-A-PORTER香港
2021/03/08 全球购物
英文版餐饮业求职信
2013/10/18 职场文书
如何写贫困证明申请书
2014/10/29 职场文书
2015年妇幼卫生工作总结
2015/05/23 职场文书
复兴之路纪录片观后感
2015/06/02 职场文书
用基于python的appium爬取b站直播消费记录
2021/04/17 Python
python实现Thrift服务端的方法
2021/04/20 Python
ipad隐藏软件app图标方法
2022/04/19 数码科技