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

发布时间 - 2026-01-11 01:57:39    点击率:

回调函数用起来比较爽。特别是在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列表list内建函数用法实例分析【insert、remove、index、pop等】  # Python学习教程之常用的内置函数大全  # python函数中return后的语句一定不会执行吗?  # Python正则表达式常用函数总结  # python3.4用函数操作mysql5.7数据库  # 详谈Python基础之内置函数和递归  # Python入门之三角函数tan()函数实例详解  # 回调  # 自己的  # 是在  # 我写  # 复用  # kwargs  # callback  # crawl  # url  # isinstance  # func  # getattr  # basestring  # hasattr  # def  # pre  # class  # js  # brush 


相关栏目: 【 网站优化151355 】 【 网络推广146373 】 【 网络技术251813 】 【 AI营销90571


相关推荐: 谷歌浏览器如何更改浏览器主题 Google Chrome主题设置教程  百度输入法ai面板怎么关 百度输入法ai面板隐藏技巧  如何挑选高效建站主机与优质域名?  如何获取PHP WAP自助建站系统源码?  如何在 Pandas 中基于一列条件计算另一列的分组均值  Laravel如何获取当前用户信息_Laravel Auth门面获取用户ID  PHP怎么接收前端传的文件路径_处理文件路径参数接收方法【汇总】  如何用西部建站助手快速创建专业网站?  专业型网站制作公司有哪些,我设计专业的,谁给推荐几个设计师兼职类的网站?  Windows10怎样连接蓝牙设备_Windows10蓝牙连接步骤【教程】  如何在建站之星绑定自定义域名?  javascript读取文本节点方法小结  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  Laravel如何正确地在控制器和模型之间分配逻辑_Laravel代码职责分离与架构建议  如何快速搭建FTP站点实现文件共享?  JS实现鼠标移上去显示图片或微信二维码  Laravel如何使用Laravel Vite编译前端_Laravel10以上版本前端静态资源管理【教程】  Java遍历集合的三种方式  安克发布新款氮化镓充电宝:体积缩小 30%,支持 200W 输出  如何正确选择百度移动适配建站域名?  Laravel怎么实现前端Toast弹窗提示_Laravel Session闪存数据Flash传递给前端【方法】  Laravel如何实现模型的全局作用域?(Global Scope示例)  Laravel如何使用Socialite实现第三方登录?(微信/GitHub示例)  如何在HTML表单中获取用户输入并结合JavaScript动态控制复利计算循环  电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?  如何在VPS电脑上快速搭建网站?  Internet Explorer官网直接进入 IE浏览器在线体验版网址  Win10如何卸载预装Edge扩展_Win10卸载Edge扩展教程【方法】  如何用y主机助手快速搭建网站?  Laravel如何生成PDF或Excel文件_Laravel文档导出工具与使用教程  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  国美网站制作流程,国美电器蒸汽鍋怎么用官方网站?  无锡营销型网站制作公司,无锡网选车牌流程?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  如何在 Python 中将列表项按字母顺序编号(a.、b.、c. …)  SQL查询语句优化的实用方法总结  今日头条AI怎样推荐抢票工具_今日头条AI抢票工具推荐算法与筛选【技巧】  如何在 React 中条件性地遍历数组并渲染元素  Laravel怎么调用外部API_Laravel Http Client客户端使用  Laravel的Blade指令怎么自定义_创建你自己的Laravel Blade Directives  浅谈javascript alert和confirm的美化  大学网站设计制作软件有哪些,如何将网站制作成自己app?  如何用JavaScript实现文本编辑器_光标和选区怎么处理  如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)  宙斯浏览器视频悬浮窗怎么开启 边看视频边操作其他应用教程  网站制作公司哪里好做,成都网站制作公司哪家做得比较好,更正规?  Laravel怎么集成Log日志记录_Laravel单文件与每日日志配置及自定义通道【详解】  如何有效防御Web建站篡改攻击?  浅析上传头像示例及其注意事项