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 从远程服务器下载日志文件的程序
Feb 10 Python
python实现根据用户输入从电影网站获取影片信息的方法
Apr 07 Python
python动态性强类型用法实例
May 09 Python
详解Python3中yield生成器的用法
Aug 20 Python
Python生成密码库功能示例
May 23 Python
Python实现的人工神经网络算法示例【基于反向传播算法】
Nov 11 Python
Python set常用操作函数集锦
Nov 15 Python
Python中类的创建和实例化操作示例
Feb 27 Python
Python编程快速上手——疯狂填词程序实现方法分析
Feb 29 Python
python调用jenkinsAPI构建jenkins,并传递参数的示例
Dec 09 Python
Python Pandas数据分析之iloc和loc的用法详解
Nov 11 Python
Python+tkinter实现高清图片保存
Mar 13 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基础学习小结
2011/04/17 PHP
Yii2实现ajax上传图片插件用法
2016/04/28 PHP
Flash+XML滚动新闻代码 无图片 附源码下载
2007/11/22 Javascript
解读IE和firefox下JScript和HREF的执行顺序
2008/01/12 Javascript
超简单的jquery的AJAX用法
2010/05/10 Javascript
教您去掉ie网页加载进度条的方法
2010/12/09 Javascript
javaScript 动态访问JSon元素示例代码
2013/08/30 Javascript
javascript常用经典算法实例详解
2015/11/25 Javascript
总结JavaScript三种数据存储方式之间的区别
2016/05/03 Javascript
jQuery制作圣诞主题页面 更像是爱情影集
2016/08/10 Javascript
Bootstrap框架的学习教程详解(二)
2016/10/18 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
JavaScript中的toString()和toLocaleString()方法的区别
2017/02/15 Javascript
javascript 中模板方法单例的实现方法
2017/10/17 Javascript
jQuery实现打开网页自动弹出遮罩层或点击弹出遮罩层功能示例
2017/10/19 jQuery
vue-cli 默认路由再子路由选中下的选中状态问题及解决代码
2018/09/06 Javascript
Vue项目中配置pug解析支持
2019/05/10 Javascript
vue实现div单选多选功能
2020/07/16 Javascript
javascript实现京东登录显示隐藏密码
2020/08/02 Javascript
Vue实现简易购物车页面
2020/12/30 Vue.js
使用C语言来扩展Python程序和Zope服务器的教程
2015/04/14 Python
python关闭windows进程的方法
2015/04/18 Python
在Django中编写模版节点及注册标签的方法
2015/07/20 Python
浅析Python 引号、注释、字符串
2019/07/25 Python
selenium2.0中常用的python函数汇总
2019/08/05 Python
Python PyQt5模块实现窗口GUI界面代码实例
2020/05/12 Python
python中scrapy处理项目数据的实例分析
2020/11/22 Python
英国高端食品和葡萄酒超市:Waitrose
2016/08/23 全球购物
Street One瑞士:德国现代时装公司
2019/10/09 全球购物
英国最大的在线快递公司之一:ParcelHero
2019/11/04 全球购物
前处理组长岗位职责
2014/03/01 职场文书
新闻专业毕业生英文求职信
2014/03/19 职场文书
法制演讲稿
2014/09/10 职场文书
学前班幼儿评语大全
2014/12/29 职场文书
我收到了德劲DE1107
2022/04/05 无线电
 python中的元类metaclass详情
2022/05/30 Python