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删除过期文件的方法
May 29 Python
python爬虫的工作原理
Mar 05 Python
Python编程使用tkinter模块实现计算器软件完整代码示例
Nov 29 Python
Python将多个excel表格合并为一个表格
Feb 22 Python
全面了解Nginx, WSGI, Flask之间的关系
Jan 09 Python
Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)
Apr 30 Python
python MNIST手写识别数据调用API的方法
Aug 08 Python
Python中的元组介绍
Jan 28 Python
python3+PyQt5 自定义窗口部件--使用窗口部件样式表的方法
Jun 26 Python
Python 经典算法100及解析(小结)
Sep 13 Python
Python Switch Case三种实现方法代码实例
Jun 18 Python
python如何设置静态变量
Sep 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
也谈php网站在线人数统计
2008/04/09 PHP
解析dedecms空间迁移步骤详解
2013/05/15 PHP
9条PHP编程小知识及易犯的小错误
2015/01/22 PHP
四个PHP非常实用的功能
2015/09/29 PHP
微信企业转账之入口类分装php代码
2018/10/01 PHP
Prototype使用指南之base.js
2007/01/10 Javascript
超强的IE背景图片闪烁(抖动)的解决办法
2007/09/09 Javascript
JS 自动安装exe程序
2008/11/30 Javascript
JS网页图片按比例自适应缩放实现方法
2014/01/15 Javascript
在JS中解析HTML字符串示例代码
2014/04/16 Javascript
一段非常简单的js判断浏览器的内核
2014/08/17 Javascript
jQuery获取对象简单实现方法小结
2014/10/30 Javascript
JS实现判断滚动条滚到页面底部并执行事件的方法
2014/12/18 Javascript
js贪吃蛇网页版游戏特效代码分享(挑战十关)
2015/08/24 Javascript
基于javascript实现漂亮的页面过渡动画效果附源码下载
2015/10/26 Javascript
如何解决easyui自定义标签 datagrid edit combobox 手动输入保存不上
2015/12/26 Javascript
Jquery获取第一个子元素简单实例
2016/06/02 Javascript
微信小程序  生命周期详解
2016/10/27 Javascript
MUI 解决动态列表页图片懒加载再次加载不成功的bug问题
2017/04/13 Javascript
Vue内部渲染视图的方法
2019/09/02 Javascript
layui 地区三级联动 form select 渲染的实例
2019/09/27 Javascript
浅析JavaScript预编译和暗示全局变量
2020/09/03 Javascript
[05:49]DOTA2-DPC中国联赛 正赛 Elephant vs LBZS 选手采访
2021/03/11 DOTA
浅谈Python中的私有变量
2018/02/28 Python
Python将DataFrame的某一列作为index的方法
2018/04/08 Python
Python 利用切片从列表中取出一部分使用的方法
2019/02/01 Python
Python元组常见操作示例
2019/02/19 Python
Django 大文件下载实现过程解析
2019/08/01 Python
树莓派4B+opencv4+python 打开摄像头的实现方法
2019/10/18 Python
Python实现屏幕录制功能的代码
2020/03/02 Python
html5的画布canvas——画出弧线、旋转的图形实例代码+效果图
2013/06/09 HTML / CSS
使用PDF.JS插件在HTML中预览PDF文件的方法
2018/08/29 HTML / CSS
墨尔本复古时尚品牌:Dangerfield
2018/12/12 全球购物
领导班子四风问题个人对照检查材料
2014/10/04 职场文书
教师批评与自我批评(群众路线)
2014/10/15 职场文书
刘胡兰观后感
2015/06/16 职场文书