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将图片文件转换成base64编码的方法
Mar 14 Python
python实现基本进制转换的方法
Jul 11 Python
python之Socket网络编程详解
Sep 29 Python
Python基于回溯法子集树模板解决找零问题示例
Sep 11 Python
python保存文件方法小结
Jul 27 Python
Python实现DDos攻击实例详解
Feb 02 Python
详解从Django Allauth中进行登录改造小结
Dec 18 Python
Python接口自动化判断元素原理解析
Feb 24 Python
python由已知数组快速生成新数组的方法
Apr 08 Python
使用python+poco+夜神模拟器进行自动化测试实例
Apr 23 Python
Django获取model中的字段名和字段的verbose_name方式
May 19 Python
MAC平台基于Python Appium环境搭建过程图解
Aug 13 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
基于Jquery的表格隔行换色,移动换色,点击换色插件
2010/12/22 Javascript
jQuery对表单元素的取值和赋值操作代码
2011/05/19 Javascript
基于jquery的无刷新分页技术
2011/06/11 Javascript
javascript 兼容所有浏览器的DOM扩展功能
2012/08/01 Javascript
JS函数this的用法实例分析
2015/02/05 Javascript
JavaScript判断FileUpload控件上传文件类型
2015/09/28 Javascript
jQuery移动web开发中的页面初始化与加载事件
2015/12/03 Javascript
Javascript之深入浅出prototype
2017/02/06 Javascript
Vue2.0 从零开始_环境搭建操作步骤
2017/06/14 Javascript
MUI实现上拉加载和下拉刷新效果
2017/06/30 Javascript
AngularJS模糊查询功能实现代码(过滤内容下拉菜单排序过滤敏感字符验证判断后添加表格信息)
2017/10/24 Javascript
浅谈jquery中ajax跨域提交的时候会有2次请求的问题
2017/11/10 jQuery
详解vue中async-await的使用误区
2018/12/05 Javascript
微信小程序学习总结(一)项目创建与目录结构分析
2020/06/04 Javascript
Vue多选列表组件深入详解
2021/03/02 Vue.js
[01:33]DOTA2上海特级锦标赛 LIQUID战队完整宣传片
2016/03/16 DOTA
使用Python脚本对Linux服务器进行监控的教程
2015/04/02 Python
在Python的Flask框架下使用sqlalchemy库的简单教程
2015/04/09 Python
python生成器generator用法实例分析
2015/06/04 Python
在PyCharm环境中使用Jupyter Notebook的两种方法总结
2018/05/24 Python
django使用LDAP验证的方法示例
2018/12/10 Python
初探利用Python进行图文识别(OCR)
2019/02/26 Python
Python数据存储之 h5py详解
2019/12/26 Python
python中selenium库的基本使用详解
2020/07/31 Python
利用CSS3的特性改变文本选中时的颜色
2013/09/11 HTML / CSS
一款纯css3制作的2015年元旦雪人动画特效教程
2014/12/29 HTML / CSS
Wolford法国官网:奥地利奢侈内衣品牌
2020/08/11 全球购物
计算机求职信
2013/12/01 职场文书
《放飞蜻蜓》教学反思
2014/04/27 职场文书
大学生个人求职信例文
2014/07/07 职场文书
2014年党员自我评价材料
2014/09/22 职场文书
学校法制宣传日活动总结
2014/11/01 职场文书
典型事迹材料范文
2014/12/29 职场文书
三下乡个人总结
2015/03/04 职场文书
小学教师暑期培训心得体会
2016/01/09 职场文书
Java实现HTML转为Word的示例代码
2022/06/28 Java/Android