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中time模块与datetime模块在使用中的不同之处
Nov 24 Python
Python使用当前时间、随机数产生一个唯一数字的方法
Sep 18 Python
Python连接phoenix的方法示例
Sep 29 Python
Python数据结构与算法之图的基本实现及迭代器实例详解
Dec 12 Python
Python实现合并同一个文件夹下所有txt文件的方法示例
Apr 26 Python
django 实现电子支付功能的示例代码
Jul 25 Python
Python闭包思想与用法浅析
Dec 27 Python
Python 一键制作微信好友图片墙的方法
May 16 Python
python中PS 图像调整算法原理之亮度调整
Jun 28 Python
python3中编码获取网页的实例方法
Nov 16 Python
Pytorch模型迁移和迁移学习,导入部分模型参数的操作
Mar 03 Python
解决pycharm安装scrapy DLL load failed:找不到指定的程序的问题
Jun 08 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/11/07 PHP
ECSHOP完美解决Deprecated: preg_replace()报错的问题
2016/05/17 PHP
javascript full screen 全屏显示页面元素的方法
2013/09/27 Javascript
Jquery Uploadify上传带进度条的简单实例
2014/02/12 Javascript
jQuery实现的网页左侧在线客服效果代码
2015/10/23 Javascript
jQuery常用的一些技巧汇总
2016/03/26 Javascript
一些实用性较高的js方法
2016/04/19 Javascript
JS变量中有var定义和无var定义的区别以及es6中let命令和const命令
2017/02/19 Javascript
ES6下子组件调用父组件的方法(推荐)
2018/02/23 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
深入浅析Vue.js 中的 v-for 列表渲染指令
2018/11/19 Javascript
JS module的导出和导入的实现代码
2019/02/25 Javascript
Nodejs libuv运行原理详解
2019/08/21 NodeJs
js+html实现点名系统功能
2019/11/05 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
Python基于Matplotlib库简单绘制折线图的方法示例
2017/08/14 Python
Python数据结构与算法之图的最短路径(Dijkstra算法)完整实例
2017/12/12 Python
Python实现将数据框数据写入mongodb及mysql数据库的方法
2018/04/02 Python
Python装饰器原理与简单用法实例分析
2018/04/29 Python
Python 变量类型详解
2018/10/10 Python
Ubuntu配置Pytorch on Graph (PoG)环境过程图解
2020/11/19 Python
html5中audio支持音频格式的解决方法
2018/08/24 HTML / CSS
Solid & Striped官网:美国泳装品牌
2019/06/19 全球购物
北美最大的参茸药食商城:德成行
2020/12/06 全球购物
商务英语专业毕业生自荐信
2013/11/05 职场文书
高中语文课后反思
2014/04/27 职场文书
新教师培训心得体会
2014/09/02 职场文书
付款委托书范本
2014/10/05 职场文书
医院保洁员岗位职责
2015/02/13 职场文书
2015年世界无烟日演讲稿
2015/03/18 职场文书
公司表扬稿范文
2015/05/05 职场文书
2016暑期校本培训心得体会
2016/01/08 职场文书
2016继续教育培训学习心得体会
2016/01/19 职场文书
一文搞懂MySQL索引页结构
2022/02/28 MySQL
Ruby处理YAML和json数据
2022/04/18 Ruby
js前端图片加载异常兜底方案
2022/06/21 Javascript