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中用keys()方法返回字典键的教程
May 21 Python
在Linux命令行终端中使用python的简单方法(推荐)
Jan 23 Python
Python编程实现输入某年某月某日计算出这一天是该年第几天的方法
Apr 18 Python
python判断字符串是否是json格式方法分享
Nov 07 Python
Python之列表实现栈的工作功能
Jan 28 Python
python网络爬虫 CrawlSpider使用详解
Sep 27 Python
Windows平台Python编程必会模块之pywin32介绍
Oct 01 Python
Python中logging日志库实例详解
Feb 19 Python
python实现井字棋小游戏
Mar 04 Python
python 安装impala包步骤
Mar 28 Python
如何解决安装python3.6.1失败
Jul 01 Python
python实现模拟器爬取抖音评论数据的示例代码
Jan 06 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
dedecms中显示数字验证码的修改方法
2007/03/21 PHP
PHP为表单获取的URL 地址预设 http 字符串函数代码
2010/05/26 PHP
使用 PHPMAILER 发送邮件实例应用
2012/11/07 PHP
解决php表单重复提交实现方法
2015/09/29 PHP
基于PHP如何把汉字转化为拼音
2015/12/11 PHP
Laravel Memcached缓存驱动的配置与应用方法分析
2016/10/08 PHP
web css实现整站样式互相切换
2013/10/29 Javascript
JavaScript对象的property属性详解
2014/04/01 Javascript
JS修改iframe页面背景颜色的方法
2015/04/01 Javascript
jQuery实现切换页面过渡动画效果
2015/10/29 Javascript
js 判断各种数据类型的简单方法(推荐)
2016/08/29 Javascript
js仿网易表单及时验证功能
2017/03/07 Javascript
node.js利用mongoose获取mongodb数据的格式化问题详解
2017/10/06 Javascript
node.js中路由,中间件,ge请求和post请求的参数详解
2017/12/26 Javascript
详解Node.js中的Async和Await函数
2018/02/22 Javascript
angularjs $http调用接口的方式详解
2018/08/13 Javascript
Python中的Classes和Metaclasses详解
2015/04/02 Python
Python中正则表达式的详细教程
2015/04/30 Python
利用python 更新ssh 远程代码 操作远程服务器的实现代码
2018/02/08 Python
Python装饰器实现方法及应用场景详解
2020/03/26 Python
TensorFlow tf.nn.softmax_cross_entropy_with_logits的用法
2020/04/19 Python
Html5新增标签有哪些
2017/04/13 HTML / CSS
详解如何解决H5开发使用wx.hideMenuItems无效果不生效
2021/01/20 HTML / CSS
以实惠的价格轻松租车,免费取消:Easyrentcars
2019/07/16 全球购物
Java里面StringBuilder和StringBuffer有什么区别
2016/06/06 面试题
人民调解员培训方案
2014/06/05 职场文书
水电维修专业推荐信
2014/09/06 职场文书
求职自我评价怎么写
2015/03/09 职场文书
2015年库房工作总结
2015/04/30 职场文书
员工离职证明范本
2015/06/12 职场文书
《刷子李》教学反思
2016/02/20 职场文书
四年级语文教学反思
2016/03/03 职场文书
Python基础详解之描述符
2021/04/28 Python
Java比较两个对象中全部属性值是否相等的方法
2021/08/07 Java/Android
Python读写yaml文件
2022/03/20 Python
OpenCV实现常见的四种图像几何变换
2022/04/01 Python