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 23 Python
python以环状形式组合排列图片并输出的方法
Mar 17 Python
Python的randrange()方法使用教程
May 15 Python
python线程、进程和协程详解
Jul 19 Python
利用Python脚本生成sitemap.xml的实现方法
Jan 31 Python
python 弹窗提示警告框MessageBox的实例
Jun 18 Python
Python2和3字符编码的区别知识点整理
Aug 08 Python
pytorch下使用LSTM神经网络写诗实例
Jan 14 Python
Anaconda+Pycharm环境下的PyTorch配置方法
Mar 13 Python
pytorch 把图片数据转化成tensor的操作
Mar 04 Python
python glom模块的使用简介
Apr 13 Python
Python 图片添加美颜效果
Apr 28 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/01/10 PHP
thinkphp实现数组分页示例
2014/04/13 PHP
zend framework中使用memcache的方法
2016/03/04 PHP
Yii净化器CHtmlPurifier用法示例(过滤不良代码)
2016/07/15 PHP
laravel实现批量更新多条记录的方法示例
2017/10/22 PHP
重定向实现代码
2006/11/20 Javascript
JS+CSS实现Li列表隔行换色效果的方法
2015/02/16 Javascript
jquery.gridrotator实现响应式图片展示画廊效果
2015/06/23 Javascript
javascript单例模式的简单实现方法
2015/07/25 Javascript
JS使用正则表达式除去字符串中重复字符的方法
2015/11/05 Javascript
JS遍历数组及打印数组实例分析
2016/01/21 Javascript
javascript中apply、call和bind的使用区别
2016/04/05 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
jQuery组件easyui基本布局实现代码
2016/08/25 Javascript
JavaScript排序算法动画演示效果的实现方法
2016/10/18 Javascript
JS制作适用于手机和电脑的通知信息效果
2016/10/28 Javascript
JavaScript中的子窗口与父窗口的互相调用问题
2017/02/08 Javascript
详解AngularJs路由之Ui-router-resolve(预加载)
2017/06/13 Javascript
jQuery实现所有验证通过方可提交的表单验证
2017/11/21 jQuery
解决vue中修改了数据但视图无法更新的情况
2018/08/27 Javascript
vue路由切换之淡入淡出的简单实现
2019/10/31 Javascript
教大家使用Python SqlAlchemy
2016/02/12 Python
django.db.utils.ProgrammingError: (1146, u“Table‘’ doesn’t exist”)问题的解决
2018/07/13 Python
浅谈python图片处理Image和skimage的区别
2019/08/04 Python
tensorflow使用freeze_graph.py将ckpt转为pb文件的方法
2020/04/22 Python
Python利用Xpath选择器爬取京东网商品信息
2020/06/01 Python
Python命令行参数argv和argparse该如何使用
2021/02/08 Python
html5 canvas 简单画板实现代码
2012/01/05 HTML / CSS
爱尔兰家电数码商城:Currys PC World爱尔兰
2016/07/23 全球购物
德国玩具商店:Planet Happy DE
2021/01/16 全球购物
药学专业大学生个人的自我评价
2013/11/04 职场文书
网络编辑求职信
2014/04/30 职场文书
团结就是力量演讲稿
2014/05/21 职场文书
详解Java实践之建造者模式
2021/06/18 Java/Android
vue使用wavesurfer.js解决音频可视化播放问题
2022/04/04 Vue.js
nginx 配置缓存
2022/05/11 Servers