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的Django框架中inclusion_tag的使用
Jul 21 Python
玩转python爬虫之cookie使用方法
Feb 17 Python
Atom的python插件和常用插件说明
Jul 08 Python
python opencv实现图片旋转矩形分割
Jul 26 Python
pycharm恢复默认设置或者是替换pycharm的解释器实例
Oct 29 Python
Python面向对象程序设计构造函数和析构函数用法分析
Apr 12 Python
Python3 利用face_recognition实现人脸识别的方法
Mar 13 Python
Python如何用wx模块创建文本编辑器
Jun 07 Python
Django Form设置文本框为readonly操作
Jul 03 Python
Pandas中DataFrame基本函数整理(小结)
Jul 20 Python
Pycharm同步远程服务器调试的方法步骤
Nov 04 Python
Python爬虫实战之爬取携程评论
Jun 02 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下foreach提示Warning:Invalid argument supplied for foreach()的解决方法
2014/11/11 PHP
php使用memcoder将视频转成mp4格式的方法
2015/03/12 PHP
php使用cookie实现记住用户名和密码实现代码
2015/04/27 PHP
php metaphone()函数及php localeconv() 函数实例解析
2016/05/15 PHP
PHP保存Base64图片base64_decode的问题整理
2019/11/04 PHP
使javascript也能包含文件
2006/10/26 Javascript
javascript 简单抽屉效果的实现代码
2010/03/09 Javascript
jCallout 轻松实现气泡提示功能
2013/09/22 Javascript
微信小程序中的onLoad详解及简单实例
2017/04/05 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
vue父组件异步获取数据传给子组件的方法
2018/07/26 Javascript
微信小程序下拉刷新PullDownRefresh的使用方法
2018/11/29 Javascript
微信小程序获取用户openid的实现
2018/12/24 Javascript
微信JS-SDK updateAppMessageShareData安卓不能自定义分享详解
2019/03/29 Javascript
vue实现新闻展示页的步骤详解
2019/04/11 Javascript
关于JS解构的5种有趣用法
2019/09/05 Javascript
python中将阿拉伯数字转换成中文的实现代码
2011/05/19 Python
Python实现将数据库一键导出为Excel表格的实例
2016/12/30 Python
Python基于pygame模块播放MP3的方法示例
2017/09/30 Python
Python3实战之爬虫抓取网易云音乐的热门评论
2017/10/09 Python
transform python环境快速配置方法
2018/09/27 Python
Python高级特性与几种函数的讲解
2019/03/08 Python
详解Python循环作用域与闭包
2019/03/21 Python
通过Python实现一个简单的html页面
2020/05/16 Python
Python 利用flask搭建一个共享服务器的步骤
2020/12/05 Python
python可视化分析的实现(matplotlib、seaborn、ggplot2)
2021/02/03 Python
英国最大的纸工艺品商店:CraftStash
2018/12/01 全球购物
匡威德国官网:Converse德国
2019/01/26 全球购物
十佳美德少年事迹材料
2014/02/05 职场文书
家长会主持词
2014/03/26 职场文书
老人祝寿主持词
2014/03/28 职场文书
投资意向书范本
2014/04/01 职场文书
爱国卫生月活动总结范文
2014/04/25 职场文书
小王子读书笔记
2015/06/29 职场文书
大学新生入学感想
2015/08/07 职场文书
Apache压力测试工具的安装使用
2021/03/31 Servers