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中的异常处理
Apr 28 Python
Python中List.index()方法的使用教程
May 20 Python
详解Python使用simplejson模块解析JSON的方法
Mar 24 Python
Python内置数据结构与操作符的练习题集锦
Jul 01 Python
Python实现图片滑动式验证识别方法
Nov 09 Python
利用python和百度地图API实现数据地图标注的方法
May 13 Python
python中的decimal类型转换实例详解
Jun 26 Python
Python进度条的制作代码实例
Aug 31 Python
Python OpenCV图像指定区域裁剪的实现
Oct 30 Python
Pytorch实现LSTM和GRU示例
Jan 14 Python
python3+opencv生成不规则黑白mask实例
Feb 19 Python
python实现秒杀商品的微信自动提醒功能(代码详解)
Apr 27 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树的代码,可以嵌套任意层
2006/10/09 PHP
javascript数组与php数组的地址传递及值传递用法实例
2015/01/22 PHP
JavaScript中的集合及效率
2010/01/08 Javascript
dojo学习第二天 ajax异步请求之绑定列表
2011/08/29 Javascript
MooBox 基于Mootools的对话框插件
2012/01/20 Javascript
Javascript中找到子元素在父元素内相对位置的代码
2012/07/21 Javascript
JavaScript中的稀疏数组与密集数组[译]
2012/09/17 Javascript
使用apply方法实现javascript中的对象继承
2013/12/16 Javascript
js禁止回车提交表单的示例代码
2013/12/23 Javascript
javascript判断是手机还是电脑访问网页的简单实例分享
2014/06/03 Javascript
基于jQuery实现拖拽图标到回收站并删除功能
2015/11/25 Javascript
jQuery实现二级下拉菜单效果
2016/01/05 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
bootstrap为水平排列的表单和内联表单设置可选的图标
2017/02/15 Javascript
vue项目实战总结篇
2018/02/11 Javascript
解决vue处理axios post请求传参的问题
2018/03/05 Javascript
深入Node TCP模块的理解
2019/03/13 Javascript
VUE渲染后端返回含有script标签的html字符串示例
2019/10/28 Javascript
微信小程序 接入腾讯地图的两种写法
2021/01/12 Javascript
Python素数检测实例分析
2015/06/15 Python
使用Scrapy爬取动态数据
2018/10/21 Python
Python装饰器限制函数运行时间超时则退出执行
2019/04/09 Python
关于Keras Dense层整理
2020/05/21 Python
使用OpenCV校准鱼眼镜头的方法
2020/11/26 Python
移动端解决悬浮层(悬浮header、footer)会遮挡住内容的3种方法
2015/03/27 HTML / CSS
可持续木材、生态和铝制太阳镜:Proof Eyewear
2019/07/24 全球购物
eBay比利时购物网站:eBay.be
2019/08/09 全球购物
介绍一下Java中的Class类
2015/04/10 面试题
建筑工程专业毕业生自荐信
2013/10/19 职场文书
销售顾问工作计划书
2014/09/15 职场文书
2014年检察院个人工作总结
2014/12/09 职场文书
2016年世界艾滋病日宣传活动总结
2016/04/01 职场文书
导游词之桂林
2019/08/20 职场文书
创业计划书之珠宝饰品
2019/08/26 职场文书
我对PyTorch dataloader里的shuffle=True的理解
2021/05/20 Python