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实现给字典添加条目的方法
Sep 25 Python
Python标准库内置函数complex介绍
Nov 25 Python
用C++封装MySQL的API的教程
May 06 Python
用Python的Flask框架结合MySQL写一个内存监控程序
Nov 07 Python
python cx_Oracle的基础使用方法(连接和增删改查)
Nov 19 Python
python 获取毫秒数,计算调用时长的方法
Feb 20 Python
提升Python效率之使用循环机制代替递归函数
Jul 23 Python
python实现BP神经网络回归预测模型
Aug 09 Python
Python 多线程其他属性以及继承Thread类详解
Aug 28 Python
python2.7实现复制大量文件及文件夹资料
Aug 31 Python
python实现与redis交互操作详解
Apr 21 Python
再谈python_tkinter弹出对话框创建
Mar 20 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中$_SERVER的详细参数与说明
2008/07/29 PHP
php入门学习知识点四 PHP正则表达式基本应用
2011/07/14 PHP
Thinkphp无限级分类代码
2015/11/11 PHP
如何让页面加载完成后执行js
2013/06/26 Javascript
RequireJS简易绘图程序开发
2016/10/28 Javascript
JS键盘版计算器的制作方法
2016/12/03 Javascript
jQuery实现模糊查询的方法分析
2018/05/10 jQuery
在Vant的基础上封装下拉日期控件的代码示例
2018/12/05 Javascript
JavaScript函数式编程(Functional Programming)组合函数(Composition)用法分析
2019/05/22 Javascript
jQuery 筛选器简单操作示例
2019/10/02 jQuery
vue实现扫码功能
2020/01/17 Javascript
JavaScript实现拖拽功能
2020/02/11 Javascript
Vue使用Element实现增删改查+打包的步骤
2020/11/25 Vue.js
element-ui 弹窗组件封装的步骤
2021/01/22 Javascript
Python获取文件ssdeep值的方法
2014/10/05 Python
python利用thrift服务读取hbase数据的方法
2018/12/27 Python
Python数据预处理之数据规范化(归一化)示例
2019/01/08 Python
Python设计模式之组合模式原理与用法实例分析
2019/01/11 Python
Python爬取视频(其实是一篇福利)过程解析
2019/08/01 Python
Django ORM 聚合查询和分组查询实现详解
2019/08/09 Python
Pandas缺失值2种处理方式代码实例
2020/06/13 Python
分布式全文检索引擎ElasticSearch原理及使用实例
2020/11/14 Python
使用CSS3的appearance属性改变元素的外观的方法
2015/12/12 HTML / CSS
沃尔玛旗下墨西哥超市:Bodega Aurrera
2020/11/13 全球购物
计算机网络专业推荐信
2013/11/24 职场文书
校园奶茶店创业计划书
2014/01/23 职场文书
女儿十岁生日答谢词
2014/01/27 职场文书
小学生植树节活动总结
2014/07/04 职场文书
护士自我推荐信范文
2015/03/24 职场文书
宣传稿格式范文
2015/07/23 职场文书
2016年优秀党务工作者先进事迹材料
2016/02/29 职场文书
在JavaScript中如何使用宏详解
2021/05/06 Javascript
ztree+ajax实现文件树下载功能
2021/05/18 Javascript
Vue CLI中模式与环境变量的深入详解
2021/05/30 Vue.js
解决Mysql的left join无效及使用的注意事项说明
2021/07/01 MySQL
笔记本自带的win11如何跳过联网激活?
2022/04/20 数码科技