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 相关文章推荐
Win7上搭建Cocos2d-x 3.1.1开发环境
Jul 03 Python
python 3利用BeautifulSoup抓取div标签的方法示例
May 28 Python
Python标准库笔记struct模块的使用
Feb 22 Python
django的登录注册系统的示例代码
May 14 Python
Sanic框架流式传输操作示例
Jul 18 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
[原创]Python入门教程3. 列表基本操作【定义、运算、常用函数】
Oct 30 Python
Python+appium框架原生代码实现App自动化测试详解
Mar 06 Python
python对XML文件的操作实现代码
Mar 27 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
selenium框架中driver.close()和driver.quit()关闭浏览器
Dec 08 Python
python中os.remove()用法及注意事项
Jan 31 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
一个可以删除字符串中HTML标记的PHP函数
2006/10/09 PHP
php简单对象与数组的转换函数代码(php多层数组和对象的转换)
2011/05/18 PHP
php使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
php自定义函数实现汉字转换utf8编码的方法
2016/09/29 PHP
document.onreadystatechange事件的用法分析
2009/10/17 Javascript
jQuery操作select下拉框的text值和value值的方法
2014/05/31 Javascript
给应用部分的js代码设定一个统一的入口
2014/06/15 Javascript
对 jQuery 中 data 方法的误解分析
2014/06/18 Javascript
Javascript设计模式之观察者模式的多个实现版本实例
2015/03/03 Javascript
JS动态插入并立即执行回调函数的方法
2016/04/21 Javascript
js按条件生成随机json:randomjson实现方法
2017/04/07 Javascript
Nodejs模块的调用操作实例分析
2018/12/25 NodeJs
vue中keep-alive、activated的探讨和使用详解
2020/07/26 Javascript
JavaScript setTimeout()基本用法有哪些
2020/11/04 Javascript
[04:00]DOTA2解说界神雕侠侣 CJ第四天谷子现场过生日
2013/07/30 DOTA
在Python的Flask框架中验证注册用户的Email的方法
2015/09/02 Python
解决Spyder中图片显示太小的问题
2018/04/27 Python
利用Python求阴影部分的面积实例代码
2018/12/05 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
Python如何用wx模块创建文本编辑器
2020/06/07 Python
python中的插入排序的简单用法
2021/01/19 Python
发现世界上最好的珠宝设计师:JewelStreet
2017/12/17 全球购物
澳大利亚最好的在线时尚精品店:Princess Polly
2018/01/03 全球购物
Lentiamo丹麦:购买便宜的隐形眼镜
2021/01/13 全球购物
do you have any Best Practice for testing
2016/06/04 面试题
Java如何读取CLOB字段
2013/10/10 面试题
Java中的异常处理机制的简单原理和应用
2013/04/27 面试题
2014年医院个人工作总结
2014/12/09 职场文书
写给父母的感谢信
2015/01/22 职场文书
业务员辞职信范文
2015/03/02 职场文书
建国大业观后感600字
2015/06/01 职场文书
萤火虫之墓观后感
2015/06/05 职场文书
如何使用php生成zip压缩包
2021/04/21 PHP
Vue中foreach数组与js中遍历数组的写法说明
2021/06/05 Vue.js
nginx作grpc的反向代理踩坑总结
2021/07/07 Servers
JavaScript实现简单的音乐播放器
2022/08/14 Javascript