Python多层装饰器用法实例分析


Posted in Python onFebruary 09, 2018

本文实例讲述了Python多层装饰器用法。分享给大家供大家参考,具体如下:

前言

Python 的装饰器能够在不破坏函数原本结构的基础上,对函数的功能进行补充。当我们需要对一个函数补充不同的功能,可能需要用到多层的装饰器。在我的使用过程中,遇到了两种装饰器层叠的情况,这里把这两种情况写下来,作为踩坑记录。

情况1

def A(funC):
  def decorated_C(funE):
    def decorated_E_by_CA(*args, **kwargs):
      out = funC(funE)(*args, **kwargs)
      return out +' > decorated by A'
    return decorated_E_by_CA
  return decorated_C
@A
def C(funE):
  def decorated_E_by_C(str):
    return funE(str)+' > decorated by C'
  return decorated_E_by_C
@C
def E(str):
  return str
print E('A string is ')

这种情况下首先 E(str) = C(E)(str),然后由于C = A(C),还有 E(str) = A(C)(E)(str)。这么一来他们的关系就明确了,装饰器 A 装饰的是装饰器 C,它返回了一个被装饰过的装饰器,而被装饰过的装饰器又可以去装饰函数 E。在上面的代码中,decorated_C 就是一个被装饰过的装饰器。

情况2

def A(funE_decorated_by_C):
  def redecorated_E(str):
    return funE_decorated_by_C(str)+' > redecorated by A'
  return redecorated_E
def C(funE):
  def decorated_E(str):
    return funE(str)+' > decorated by C'
  return decorated_E
@A
@C
def E(str):
  return str
print E('A string is ')

这种情况下,有 E(str) = A(C(E))(str)。首先装饰器 C 装饰函数 E,返回一个被 C 装饰过的函数,然后装饰器 A 再装饰这个被 C 装饰过的函数。与第一种情况的区别是,这里的装饰器 A 装饰的是一个函数,而不是一个装饰器

更多关于Python相关内容可查看本站专题:《Python数据结构与算法教程》、《Python Socket编程技巧总结》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

Python 相关文章推荐
python判断端口是否打开的实现代码
Feb 10 Python
Python登录并获取CSDN博客所有文章列表代码实例
Dec 28 Python
python去除文件中重复的行实例
Jun 29 Python
Django添加favicon.ico图标的示例代码
Aug 07 Python
Python类的继承用法示例
Jan 31 Python
Python命令行参数解析工具 docopt 安装和应用过程详解
Sep 26 Python
Python如何计算语句执行时间
Nov 22 Python
python模拟点击网页按钮实现方法
Feb 25 Python
django-利用session机制实现唯一登录的例子
Mar 16 Python
python中for in的用法详解
Apr 17 Python
python如何求100以内的素数
May 27 Python
Python分析最近大火的网剧《隐秘的角落》
Jul 02 Python
理论讲解python多进程并发编程
Feb 09 #Python
Python装饰器(decorator)定义与用法详解
Feb 09 #Python
详解python的ORM中Pony用法
Feb 09 #Python
python监控键盘输入实例代码
Feb 09 #Python
Python with语句上下文管理器两种实现方法分析
Feb 09 #Python
Python遍历pandas数据方法总结
Feb 09 #Python
python中的闭包函数
Feb 09 #Python
You might like
php反射应用示例
2014/02/25 PHP
帝国CMS留言板回复后发送EMAIL通知客户
2015/07/06 PHP
php实现支持中文的文件下载功能示例
2017/08/30 PHP
PHP MVC框架中类的自动加载机制实例分析
2019/09/18 PHP
json 定义
2008/06/10 Javascript
JavaScript避免代码的重复执行经验技巧分享
2014/04/17 Javascript
js获取指定日期周数以及星期几的小例子
2014/06/27 Javascript
node.js解决获取图片真实文件类型的问题
2014/12/20 Javascript
JavaScript设计模式之装饰者模式介绍
2014/12/28 Javascript
使用Raygun来自动追踪AngularJS中的异常
2015/06/23 Javascript
jquery控制显示服务器生成的图片流
2015/08/04 Javascript
jQuery实现带延迟效果的滑动菜单代码
2015/09/02 Javascript
jQuery阻止移动端遮罩层后页面滚动
2017/03/15 Javascript
js实现前端图片上传即时预览功能
2017/08/02 Javascript
jQuery使用zTree插件实现可拖拽的树示例
2017/09/23 jQuery
Three.js加载外部模型的教程详解
2017/11/10 Javascript
详解Vue中组件的缓存
2019/04/20 Javascript
浅谈VUE防抖与节流的最佳解决方案(函数式组件)
2019/05/22 Javascript
JS函数基本定义与用法示例
2020/01/15 Javascript
web.py 十分钟创建简易博客实现代码
2016/04/22 Python
Python生成随机数组的方法小结
2017/04/15 Python
PyQt5下拉式复选框QComboCheckBox的实例
2019/06/25 Python
Django框架之DRF 基于mixins来封装的视图详解
2019/07/23 Python
python操作openpyxl导出Excel 设置单元格格式及合并处理代码实例
2019/08/27 Python
springboot配置文件抽离 git管理统 配置中心详解
2019/09/02 Python
win10安装tesserocr配置 Python使用tesserocr识别字母数字验证码
2020/01/16 Python
利用keras加载训练好的.H5文件,并实现预测图片
2020/01/24 Python
HTML5学习笔记之html5与传统html区别
2016/01/06 HTML / CSS
通信工程专业毕业生推荐信
2013/12/25 职场文书
高中生评语大全
2014/04/25 职场文书
优秀党务工作者事迹材料
2014/05/07 职场文书
2014校长四风问题对照检查材料思想汇报
2014/09/16 职场文书
通用员工手册范本
2015/05/14 职场文书
2015年出纳工作总结与计划
2015/05/18 职场文书
安全生产学习心得体会
2016/01/18 职场文书
vue实现同时设置多个倒计时
2021/05/20 Vue.js