python构建自定义回调函数详解

 更新时间:2017年06月20日 08:51:03   作者:李雷雷alexkn  
在工作中,回调函数使用的场景是非常多的,下面我们就来通过例子程序来详细了解利用了Python的属性机制构建了一个自定义回调函数的使用

回调函数用起来比较爽。特别是在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项目运行导致内存越来越大的原因详析

    最近在跑python程序时,出现占用的内存不断增加的情况,下面这篇文章主要给大家介绍了关于python项目运行导致内存越来越大的原因详析,本文通过图文介绍的非常详细,需要的朋友可以参考下
    2022-11-11
  • python实现输入任意一个大写字母生成金字塔的示例

    python实现输入任意一个大写字母生成金字塔的示例

    这篇文章主要介绍了python实现输入任意一个大写字母生成金字塔的示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • Python Opencv轮廓常用操作代码实例解析

    Python Opencv轮廓常用操作代码实例解析

    这篇文章主要介绍了Python Opencv轮廓常用操作代码实例解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-09-09
  • 适合Python初学者的一些编程技巧

    适合Python初学者的一些编程技巧

    这篇文章主要介绍了给Python初学者的一些编程技巧,皆是基于基础的一些编程习惯建议,需要的朋友可以参考下
    2020-02-02
  • python实现固定尺寸图像拼接

    python实现固定尺寸图像拼接

    这篇文章主要为大家详细介绍了python实现固定尺寸图像拼接,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-04-04
  • Python中IO多路复用模块selector的用法详解

    Python中IO多路复用模块selector的用法详解

    selector 是一个实现了IO复用模型的python包,实现了IO多路复用模型的 select、poll 和 epoll 等函数,下面就跟随小编一起来学习一下它的具体使用吧
    2024-02-02
  • 将python程序打包成DLL的三种方式

    将python程序打包成DLL的三种方式

    这篇文章主要介绍了将python程序打包成DLL的三种方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-02-02
  • Python中yield返回生成器的详细方法

    Python中yield返回生成器的详细方法

    这篇文章主要介绍了Python中的yield返回生成器,生成器是Python编程进阶中的重要知识点,需要的朋友可以参考下,希望能够给你带来帮助
    2021-11-11
  • Python脚本提取fasta文件单序列信息实现

    Python脚本提取fasta文件单序列信息实现

    这篇文章主要为大家介绍了Python脚本提取fasta文件单序列信息实现示例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • python对指定字符串逆序的6种方法(小结)

    python对指定字符串逆序的6种方法(小结)

    这篇文章主要介绍了python对指定字符串逆序的6种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04

最新评论