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 相关文章推荐
Python3学习笔记之列表方法示例详解
Oct 06 Python
python绘制立方体的方法
Jul 02 Python
梅尔频率倒谱系数(mfcc)及Python实现
Jun 18 Python
浅谈PyQt5 的帮助文档查找方法,可以查看每个类的方法
Jun 25 Python
Python之虚拟环境virtualenv,pipreqs生成项目依赖第三方包的方法
Jul 23 Python
Mac安装python3的方法步骤
Aug 09 Python
Django 博客实现简单的全文搜索的示例代码
Feb 17 Python
windows、linux下打包Python3程序详细方法
Mar 17 Python
在Ubuntu 20.04中安装Pycharm 2020.1的图文教程
Apr 30 Python
解决django框架model中外键不落实到数据库问题
May 20 Python
浅析Python迭代器的高级用法
Jul 16 Python
PyTorch的Debug指南
May 07 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
phpMyAdmin2.11.6安装配置方法
2008/08/24 PHP
让CodeIgniter数据库缓存自动过期的处理的方法
2014/06/12 PHP
ThinkPHP3.1的Widget新用法
2014/06/19 PHP
php列出mysql表所有行和列的方法
2015/03/13 PHP
php基础教程
2015/08/26 PHP
PHP实现八皇后算法
2019/05/06 PHP
JQuery 选项卡效果(JS与HTML的分离)
2010/04/01 Javascript
js实现点击注册按钮开始读秒倒计时的小例子
2013/05/11 Javascript
ff下JQuery无法监听input的keyup事件的解决方法
2013/12/12 Javascript
javascript中处理时间戳为日期格式的方法
2014/01/02 Javascript
Javascript 实现图片无缝滚动
2014/12/19 Javascript
Javascript URI 解析介绍
2015/03/15 Javascript
js表单处理中单选、多选、选择框值的获取及表单的序列化
2016/03/08 Javascript
Js调用Java方法并互相传参的简单实例
2016/08/11 Javascript
Node.js中常规的文件操作总结
2016/10/13 Javascript
jQuery EasyUI结合zTree树形结构制作web页面
2017/09/01 jQuery
Three.js利用性能插件stats实现性能监听的方法
2017/09/25 Javascript
Vue项目环境搭建详细总结
2019/09/26 Javascript
你准备好迎接vue3.0了吗
2020/04/28 Javascript
vue-cli 关闭热更新操作
2020/09/18 Javascript
vue-cli3配置favicon.ico和title的流程
2020/10/27 Javascript
Python while、for、生成器、列表推导等语句的执行效率测试
2015/06/03 Python
Tensorflow训练MNIST手写数字识别模型
2020/02/13 Python
关于python中remove的一些坑小结
2021/01/04 Python
澳大利亚潮流尖端的快时尚品牌:Cotton On
2016/09/26 全球购物
荷兰演唱会和体育比赛订票网站:viagogo荷兰
2018/04/08 全球购物
大整数数相乘的问题
2012/07/22 面试题
Android面试宝典
2013/08/06 面试题
Static Nested Class 和 Inner Class的不同
2013/11/28 面试题
项目资料员岗位职责
2013/12/10 职场文书
小学开学典礼主持词
2014/03/19 职场文书
保护环境演讲稿
2014/05/10 职场文书
年终工作总结范文2014
2014/11/27 职场文书
离职信范本
2015/06/23 职场文书
2016年“12.3”国际残疾人日活动总结
2016/04/01 职场文书
SpringBoot+VUE实现数据表格的实战
2021/08/02 Java/Android