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删除指定类型(或非指定)的文件实例详解
Jul 06 Python
django 创建过滤器的实例详解
Aug 14 Python
基于Python闭包及其作用域详解
Aug 28 Python
python3.6连接MySQL和表的创建与删除实例代码
Dec 28 Python
Python读取properties配置文件操作示例
Mar 29 Python
浅谈python在提示符下使用open打开文件失败的原因及解决方法
Nov 30 Python
python图形工具turtle绘制国际象棋棋盘
May 23 Python
Python Django 简单分页的实现代码解析
Aug 21 Python
GDAL 矢量属性数据修改方式(python)
Mar 10 Python
TensorFlow使用Graph的基本操作的实现
Apr 22 Python
Python基于BeautifulSoup爬取京东商品信息
Jun 01 Python
使用Python文件读写,自定义分隔符(custom delimiter)
Jul 05 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 5.5版本的array_column()函数
2014/10/24 PHP
Laravel5中防止XSS跨站攻击的方法
2016/10/10 PHP
详解yii2实现分库分表的方案与思路
2017/02/03 PHP
php 与 nginx 的处理方式及nginx与php-fpm通信的两种方式
2018/09/28 PHP
php5对象复制、clone、浅复制与深复制实例详解
2019/08/14 PHP
一看就懂:jsonp详解
2015/06/01 Javascript
js实现的黑背景灰色二级导航菜单效果代码
2015/08/24 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
JavaScript实现复制文章自动添加版权
2016/08/02 Javascript
JavaScript中无法通过div.style.left获取值的解决方法
2017/02/19 Javascript
weex slider实现滑动底部导航功能
2017/08/28 Javascript
vue vuex vue-rouert后台项目——权限路由(适合初学)
2017/12/29 Javascript
vue2.0 子组件改变props值,并向父组件传值的方法
2018/03/01 Javascript
在Vue 中使用Typescript的示例代码
2018/09/10 Javascript
JS闭包原理与应用经典示例
2018/12/20 Javascript
js简单的分页器插件代码实例
2019/09/11 Javascript
vue中封装axios并实现api接口的统一管理
2020/12/25 Vue.js
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Django中几种重定向方法
2015/04/28 Python
python使用xlrd实现检索excel中某列含有指定字符串记录的方法
2015/05/09 Python
python检查URL是否正常访问的小技巧
2017/02/25 Python
Python yield 使用方法浅析
2017/05/20 Python
python flask 多对多表查询功能
2017/06/25 Python
基于python log取对数详解
2018/06/08 Python
django 邮件发送模块smtp使用详解
2019/07/22 Python
Python处理PDF与CDF实例
2020/02/26 Python
纯CSS实现右侧底部悬浮效果(悬浮QQ、微信、微博、邮箱等联系方式)
2015/04/24 HTML / CSS
欧洲高端品牌直销店:Fashionesta
2016/08/31 全球购物
ETO男装官方网店:ETO Jeans
2019/02/28 全球购物
你们项目是如何进行变更控制的
2015/08/26 面试题
禁毒宣传标语
2014/06/19 职场文书
2014年防汛工作总结
2014/12/08 职场文书
小学德育工作总结2015
2015/05/12 职场文书
感恩父母主题班会
2015/08/12 职场文书
2016教师廉洁从教心得体会
2016/01/13 职场文书
Python import模块的缓存问题解决方案
2021/06/02 Python