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中的Numpy入门教程
Apr 26 Python
分享一个常用的Python模拟登陆类
Mar 29 Python
Django框架中的对象列表视图使用示例
Jul 21 Python
安装Python的教程-Windows
Jul 22 Python
tensorflow实现softma识别MNIST
Mar 12 Python
解决Pycharm无法import自己安装的第三方module问题
May 18 Python
python生成多个只含0,1元素的随机数组或列表的实例
Nov 12 Python
一个可以套路别人的python小程序实例代码
Apr 09 Python
python中metaclass原理与用法详解
Jun 25 Python
python GUI库图形界面开发之PyQt5信号与槽基础使用方法与实例
Mar 06 Python
Python基于smtplib协议实现发送邮件
Jun 03 Python
windows支持哪个版本的python
Jul 03 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 数学运算验证码实现代码
2009/10/11 PHP
php zip文件解压类代码
2009/12/02 PHP
php广告加载类用法实例
2014/09/23 PHP
PHP实现bitmap位图排序与求交集的方法
2016/07/28 PHP
tp5(thinkPHP5)操作mongoDB数据库的方法
2018/01/20 PHP
php读取本地json文件的实例
2018/03/07 PHP
dreamweaver 安装Jquery智能提示
2011/04/02 Javascript
javascript常用对话框小集
2013/09/13 Javascript
纯js实现手风琴效果代码
2020/04/17 Javascript
深入理解javascript中concat方法
2016/12/12 Javascript
详解jquery validate实现表单验证 (正则表达式)
2017/01/18 Javascript
JS实现按钮控制计时开始和停止功能
2017/07/27 Javascript
自适应布局meta标签中viewport、content、width、initial-scale、minimum-scale、maximum-scale总结
2017/08/18 Javascript
Extjs 中的 Treepanel 实现菜单级联选中效果及实例代码
2017/08/22 Javascript
echarts鼠标覆盖高亮显示节点及关系名称详解
2018/03/17 Javascript
JS实现自定义弹窗功能
2018/08/08 Javascript
Mint-UI时间组件起始时间问题及时间插件使用
2018/08/20 Javascript
微信小程序用户拒绝授权的处理方法详解
2019/09/20 Javascript
vue表单中遍历表单操作按钮的显示隐藏示例
2019/10/30 Javascript
Javascript文本框脚本实现方法解析
2020/10/30 Javascript
[05:08]2014DOTA2国际邀请赛 Hao专访复仇的胜利很爽
2014/07/15 DOTA
50行代码实现贪吃蛇(具体思路及代码)
2013/04/27 Python
对python 命令的-u参数详解
2018/12/03 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
Python元组 tuple的概念与基本操作详解【定义、创建、访问、计数、推导式等】
2019/10/30 Python
TensorFlow的reshape操作 tf.reshape的实现
2020/04/19 Python
使用keras和tensorflow保存为可部署的pb格式
2020/05/25 Python
css3中用animation的steps属性制作帧动画
2019/04/25 HTML / CSS
利用css3制作3D样式按钮实现代码
2013/03/18 HTML / CSS
交通安全标语
2014/06/06 职场文书
2014年家长学校工作总结
2014/11/20 职场文书
优秀教师个人总结
2015/02/11 职场文书
董事长助理岗位职责
2015/02/11 职场文书
教师师德表现自我评价
2015/03/05 职场文书
开学季:喜迎新生,迎新标语少不了
2019/11/07 职场文书
基于PostgreSQL/openGauss 的分布式数据库解决方案
2021/12/06 PostgreSQL