python构建自定义回调函数详解


Posted in Python onJune 20, 2017

回调函数用起来比较爽。特别是在js中,满世界全是回调,那么在python中,怎么来优雅地实现自己的回调函数呢

下面贴一个我写的例子

class BaseHandler(object):

  def crawl(self, url, **kwargs):
    if kwargs.get('callback'):
      callback = kwargs['callback']
      if isinstance(callback, basestring) and hasattr(self, callback):
        func = getattr(self, callback)
      elif hasattr(callback, 'im_self') and callback.im_self is self:
        func = callback

    resp = requests.get(url)
    return func(resp)


class Anjuke(BaseHandler):
  def on_start(self):
    self.crawl(start_url, callback=self.index_url)

  def index_url(self, response):
    print response.text

a = Anjuke()
print a.on_start()

其实就是通过kwargs获取到callback的对象/字符串,然后通过getattr(self, callback)来反射得到回调的方法,然后调用即可。

接着可以进一步抽象,增加回调方法的复用,于是BaseHandler可以改写成装饰器方式

def callback(f):
  def wrapper(obj, *args, **kwargs):
    resp = f(obj, *args, **kwargs)
    if kwargs.get('callback'):
      mcallback = kwargs['callback']
      if isinstance(callback, basestring) and hasattr(obj, mcallback):
        func = getattr(obj, mcallback)
      elif hasattr(mcallback, 'im_self') and mcallback.im_self is obj:
        func = mcallback
        kwargs['callback'] = func.__name__
      else:
        raise NotImplementedError("self.%s() not implemented!" % callback)

    return func(resp)
  return wrapper


class BaseHandler(object):

  @callback
  def crawl(self, url, **kwargs):
    url = quote_chinese(_build_url(url.strip(), kwargs.get('params')))
    return requests.get(url)
Python 相关文章推荐
Python输出PowerPoint(ppt)文件中全部文字信息的方法
Apr 28 Python
Python的Bottle框架中返回静态文件和JSON对象的方法
Apr 30 Python
Python装饰器入门学习教程(九步学习)
Jan 28 Python
python利用matplotlib库绘制饼图的方法示例
Dec 18 Python
Python中类的初始化特殊方法
Dec 01 Python
Python pandas常用函数详解
Feb 07 Python
Python中列表与元组的乘法操作示例
Feb 10 Python
Python使用Windows API创建窗口示例【基于win32gui模块】
May 09 Python
Python学习笔记之抓取某只基金历史净值数据实战案例
Jun 03 Python
Windows 安装 Anaconda3+PyCharm的方法步骤
Jun 13 Python
python 读取.nii格式图像实例
Jul 01 Python
python实现b站直播自动发送弹幕功能
Feb 20 Python
Python实现完整的事务操作示例
Jun 20 #Python
python3.4用循环往mysql5.7中写数据并输出的实现方法
Jun 20 #Python
Python实现多并发访问网站功能示例
Jun 19 #Python
Python sqlite3事务处理方法实例分析
Jun 19 #Python
Python之str操作方法(详解)
Jun 19 #Python
python urllib爬取百度云连接的实例代码
Jun 19 #Python
Python的IDEL增加清屏功能实例
Jun 19 #Python
You might like
改进的IP计数器
2006/10/09 PHP
php+mysql开源XNA 聚合程序发布 下载
2007/07/13 PHP
Smarty安装配置方法
2008/04/10 PHP
PHP实现多条件查询实例代码
2010/07/17 PHP
Codeigniter实现多文件上传并创建多个缩略图
2014/06/12 PHP
[原创]PHP实现逐行删除文件右侧空格的方法
2015/12/25 PHP
php操作mongodb封装类与用法实例
2018/09/01 PHP
js不完美解决click和dblclick事件冲突问题
2012/07/16 Javascript
js实现回放拖拽轨迹从过程上进行分析
2014/06/26 Javascript
javascript操作符"!~"详解
2015/02/10 Javascript
input输入框鼠标焦点提示信息
2015/03/17 Javascript
jQuery Mobile开发中日期插件Mobiscroll使用说明
2016/03/02 Javascript
js, jQuery实现全选、反选功能
2017/03/08 Javascript
vuejs 切换导航条高亮(路由菜单高亮)的方法示例
2018/05/29 Javascript
javascript实现前端分页效果
2020/06/24 Javascript
vue 使用localstorage实现面包屑的操作
2020/11/16 Javascript
举例讲解Python设计模式编程的代理模式与抽象工厂模式
2016/01/16 Python
Python3安装psycopy2以及遇到问题解决方法
2019/07/03 Python
tensorflow 利用expand_dims和squeeze扩展和压缩tensor维度方式
2020/02/07 Python
Python猜数字算法题详解
2020/03/01 Python
解决windows上安装tensorflow时报错,“DLL load failed: 找不到指定的模块”的问题
2020/05/20 Python
python 调用API接口 获取和解析 Json数据
2020/09/28 Python
Vs Code中8个好用的python 扩展插件
2020/10/12 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
加拿大最大的五金、家居装修和园艺产品商店:RONA
2017/01/27 全球购物
美国亚马逊旗下男装网站:East Dane(支持中文)
2019/09/25 全球购物
Currentbody西班牙:美容仪专家
2019/09/28 全球购物
TCP/IP的分层模型
2013/10/27 面试题
优秀中专生推荐信
2013/11/17 职场文书
高中运动会入场词
2014/02/14 职场文书
迎元旦广播稿
2014/02/22 职场文书
委托书范文
2014/04/02 职场文书
感恩老师的演讲稿
2014/05/06 职场文书
运动会通讯稿100字
2015/07/20 职场文书
高效笔记技巧分享:学会这些让你不再困扰
2019/09/04 职场文书
Spring Boot 启动、停止、重启、状态脚本
2021/06/26 Java/Android