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中__init__()方法的高级应用
May 11 Python
浅谈python中截取字符函数strip,lstrip,rstrip
Jul 17 Python
Python基于sftp及rsa密匙实现远程拷贝文件的方法
Sep 21 Python
详解python开发环境搭建
Dec 16 Python
基于python3 类的属性、方法、封装、继承实例讲解
Sep 19 Python
Python同步遍历多个列表的示例
Feb 19 Python
python pyinstaller 加载ui路径方法
Jun 10 Python
pandas如何处理缺失值
Jul 31 Python
numpy数组做图片拼接的实现(concatenate、vstack、hstack)
Nov 08 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
Jun 18 Python
利用python+ffmpeg合并B站视频及格式转换的实例代码
Nov 24 Python
Django中template for如何使用方法
Jan 31 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
Wordpress php 分页代码
2009/10/21 PHP
解析yahoo邮件用phpmailer发送的实例
2013/06/24 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
ecshop适应在PHP7的修改方法解决报错的实现
2016/11/01 PHP
php之header的不同用法总结(实例讲解)
2017/11/28 PHP
Laravel中正确地返回HTTP状态码方法示例
2019/09/10 PHP
javascript 打开页面window.location和window.open的区别
2010/03/17 Javascript
用JavaScript仿PS里的羽化效果代码
2011/12/20 Javascript
jquery 滚动条事件简单实例
2013/07/12 Javascript
jQuery 的全选(全非选)即取得被选中的值使用介绍
2013/11/12 Javascript
js获取视频时长代码
2014/04/10 Javascript
Vue2.0生命周期的理解
2018/08/20 Javascript
解决vue A对象赋值给B对象,修改B属性会影响到A的问题
2018/09/25 Javascript
微信小程序使用canvas的画图操作示例
2019/01/18 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
vue实现拖拽的简单案例 不超出可视区域
2019/07/25 Javascript
Python中的数据对象持久化存储模块pickle的使用示例
2016/03/03 Python
Python随机函数random()使用方法小结
2018/04/29 Python
Python单元测试实例详解
2018/05/25 Python
python实现txt文件格式转换为arff格式
2018/05/31 Python
python实现批量图片格式转换
2020/06/16 Python
python中多个装饰器的执行顺序详解
2018/10/08 Python
Python中使用pypdf2合并、分割、加密pdf文件的代码详解
2019/05/21 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
简单了解Pandas缺失值处理方法
2019/11/16 Python
size?荷兰官方网站:英国高级运动鞋精品店
2020/07/24 全球购物
大学生职业生涯设计书
2014/01/02 职场文书
机关财务管理制度
2014/01/17 职场文书
会计学专业学生的求职信范文
2014/01/27 职场文书
法学毕业生自我鉴定
2014/01/31 职场文书
副董事长岗位职责
2014/04/02 职场文书
公开承诺书格式
2014/05/21 职场文书
六一亲子活动总结
2014/07/01 职场文书
干部考核工作总结2015
2015/07/24 职场文书
为什么在foreach循环中JAVA集合不能添加或删除元素
2021/06/11 Java/Android
国产动画《万圣街》日语配音版制作决定!
2022/03/20 国漫