Python中优雅实现自定义回调函数的两种方案

季宁
季宁
发布时间:2026-10-13 | 2人浏览过
原创

本文详解Python中实现自定义回调函数的两种优雅方式。首先通过kwargs接收回调标识,利用getattr进行反射调用;其次进一步抽象为装饰器模式,封装URL请求与回调逻辑,提升代码复用性与可维护性。

回调函数的使用体验通常较为顺畅。特别是在JavaScript开发中,回调机制无处不在。那么在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 相关产品和应用

全部下载

专题列表