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 相关文章推荐
Python3基础之基本运算符概述
Aug 13 Python
python连接字符串的方法小结
Jul 13 Python
Python操作RabbitMQ服务器实现消息队列的路由功能
Jun 29 Python
Python使用QQ邮箱发送Email的方法实例
Feb 09 Python
对python list 遍历删除的正确方法详解
Jun 29 Python
Python中创建二维数组
Oct 17 Python
python实现大文本文件分割
Jul 22 Python
pytorch 更改预训练模型网络结构的方法
Aug 19 Python
python动态视频下载器的实现方法
Sep 16 Python
解决pycharm 安装numpy失败的问题
Dec 05 Python
Python可以实现栈的结构吗
May 27 Python
keras K.function获取某层的输出操作
Jun 29 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
解析PHP中的unset究竟会不会释放内存
2013/07/18 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
成为好程序员必须避免的5个坏习惯
2014/07/04 PHP
php正则匹配文章中的远程图片地址并下载图片至本地
2015/09/29 PHP
thinkphp3.x中变量的获取和过滤方法详解
2016/05/20 PHP
PHP 数组遍历foreach语法结构及实例
2016/06/13 PHP
使用PHP+Redis实现延迟任务,实现自动取消订单功能
2019/11/21 PHP
Javascript之旅 对象的原型链之由来
2010/08/25 Javascript
javascript实现table选中的行以指定颜色高亮显示的方法
2015/05/13 Javascript
javascript中window.open在原来的窗口中打开新的窗口(不同名)
2015/11/15 Javascript
实例讲解避免javascript冲突的方法
2016/01/03 Javascript
JavaScript使ifram跨域相互访问及与PHP通信的实例
2016/03/03 Javascript
AngularJS 依赖注入详解和简单实例
2016/07/28 Javascript
jQuery插件HighCharts绘制简单2D折线图效果示例【附demo源码】
2017/03/21 jQuery
node koa2实现上传图片并且同步上传到七牛云存储
2017/07/31 Javascript
bootstrap轮播模板使用方法详解
2017/11/17 Javascript
react quill中图片上传由默认转成base64改成上传到服务器的方法
2019/10/30 Javascript
vscode自定义vue模板的实现
2021/01/27 Vue.js
[02:17]快乐加倍!DOTA2食人魔魔法师至宝+迎霜节活动上线
2019/12/22 DOTA
定制FileField中的上传文件名称实例
2017/08/23 Python
深入理解Python分布式爬虫原理
2017/11/23 Python
python中subprocess批量执行linux命令
2018/04/27 Python
python 3.6.4 安装配置方法图文教程
2018/09/18 Python
python自动化测试之如何解析excel文件
2019/06/27 Python
python2和python3哪个使用率高
2020/06/23 Python
python中if嵌套命令实例讲解
2021/02/25 Python
西尔斯百货官网:Sears
2016/09/06 全球购物
Mio Skincare美国官网:身体紧致及孕期身体护理
2017/03/05 全球购物
中国茶叶、茶具一站式网上购物商城:醉品茶城
2018/07/03 全球购物
社会调查研究计划书
2014/05/01 职场文书
会计专业毕业生自荐书
2014/06/25 职场文书
批评与自我批评总结
2014/10/17 职场文书
赔偿协议书怎么写
2015/01/28 职场文书
扬州个园导游词
2015/02/06 职场文书
工程款申请报告
2015/05/15 职场文书
小学六一儿童节活动开幕词
2016/03/04 职场文书