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可跨平台实现获取按键的方法
Mar 05 Python
python删除某个字符
Mar 19 Python
python 文件转成16进制数组的实例
Jul 09 Python
Python3利用Dlib实现摄像头实时人脸检测和平铺显示示例
Feb 21 Python
python binascii 进制转换实例
Jun 12 Python
树莓派使用python-librtmp实现rtmp推流h264的方法
Jul 22 Python
pytorch中的embedding词向量的使用方法
Aug 18 Python
在django中自定义字段Field详解
Dec 03 Python
实现Python与STM32通信方式
Dec 18 Python
Python实现上下文管理器的方法
Aug 07 Python
python 制作简单的音乐播放器
Nov 25 Python
聊一聊python常用的编程模块
May 14 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 数据库字段复用的基本原理与示例
2011/07/22 PHP
linux下php上传文件注意事项
2016/06/11 PHP
PHP生成随机数的方法总结
2018/03/01 PHP
php语法检查的方法总结
2019/01/21 PHP
js模拟实现Array的sort方法
2007/12/11 Javascript
JQuyer $.post 与 $.ajax 访问WCF ajax service 时的问题需要注意的地方
2011/09/20 Javascript
Javascript判断对象是否相等实现代码
2013/03/18 Javascript
js操作checkbox遇到的问题解决
2013/06/29 Javascript
node.js中的console.timeEnd方法使用说明
2014/12/09 Javascript
jQuery中DOM树操作之使用反向插入方法实例分析
2015/01/23 Javascript
jQuery弹出层插件Lightbox_me使用指南
2015/04/21 Javascript
纯js代码实现简单计算器
2015/12/02 Javascript
EasyUi combotree 实现动态加载树节点
2016/04/01 Javascript
自动适应iframe右边的高度
2016/12/22 Javascript
async/await优雅的错误处理方法总结
2019/01/30 Javascript
如何在Vue中使localStorage具有响应式(思想实验)
2020/07/14 Javascript
微信小程序实现身份证取景框拍摄
2020/09/09 Javascript
python mysqldb连接数据库
2009/03/16 Python
详解python开发环境搭建
2016/12/16 Python
对python中array.sum(axis=?)的用法介绍
2018/06/28 Python
Pandas 按索引合并数据集的方法
2018/11/15 Python
几行Python代码爬取3000+上市公司的信息
2019/01/24 Python
Python 给定的经纬度标注在地图上的实现方法
2019/07/05 Python
django 前端页面如何实现显示前N条数据
2020/03/16 Python
Django限制API访问频率常用方法解析
2020/10/12 Python
python反编译教程之2048小游戏实例
2021/03/03 Python
HTML5中新标签和常用标签详解
2014/03/07 HTML / CSS
墨西哥运动服饰和鞋网上商店:Netshoes墨西哥
2016/07/28 全球购物
澳大利亚家具和家居用品在线商店:Interiors Online
2018/03/05 全球购物
致短跑运动员广播稿
2014/01/09 职场文书
军人违纪检讨书
2014/02/04 职场文书
工商治理实习生的自我评价分享
2014/02/20 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
唐山大地震观后感
2015/06/05 职场文书
怎样评估创业计划书是否有可行性?
2019/08/07 职场文书
字节飞书面试promise.all实现示例
2022/06/16 Javascript