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获得时间的实例说明
Mar 25 Python
Python中使用OpenCV库来进行简单的气象学遥感影像计算
Feb 19 Python
利用Python批量生成任意尺寸的图片
Aug 29 Python
python使用matplotlib画饼状图
Sep 25 Python
Python函数返回不定数量的值方法
Jan 22 Python
20行python代码实现人脸识别
May 05 Python
Python+PyQT5的子线程更新UI界面的实例
Jun 14 Python
利用Python库Scapy解析pcap文件的方法
Jul 23 Python
对python3中的RE(正则表达式)-详细总结
Jul 23 Python
使用tqdm显示Python代码执行进度功能
Dec 08 Python
vscode+PyQt5安装详解步骤
Aug 12 Python
基于Python实现将列表数据生成折线图
Mar 23 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
E路文章系统PHP
2006/12/11 PHP
用PHP实现Ftp用户的在线管理的代码
2007/03/06 PHP
Zend的Registry机制的使用说明
2013/05/02 PHP
PHP的Yii框架使用中的一些错误解决方法与建议
2015/08/21 PHP
php生成二维码图片方法汇总
2016/12/17 PHP
php实现微信公众平台发红包功能
2018/06/14 PHP
IE6/7/8中Option元素未设value时Select将获取空字符串
2011/04/07 Javascript
javascript定义变量时加var与不加var的区别
2014/12/22 Javascript
jQuery插件支持同一页面被多次调用
2016/02/14 Javascript
jQuery EasyUI API 中文帮助文档和扩展实例
2016/08/01 Javascript
如何解决IONIC页面底部被遮住无法向上滚动问题
2016/09/06 Javascript
js 奇葩技巧之隐藏代码
2017/08/11 Javascript
vue2.0 中使用transition实现动画效果使用心得
2018/08/13 Javascript
angularJs中json数据转换与本地存储的实例
2018/10/08 Javascript
JavaScript对象的特性与实践应用深入详解
2018/12/30 Javascript
微信小程序获取位置展示地图并标注信息的实例代码
2019/09/01 Javascript
如何在微信小程序中存setStorage
2019/12/13 Javascript
js实现滑动滑块验证登录
2020/07/24 Javascript
Python2.5/2.6实用教程 入门基础篇
2009/11/29 Python
Python使用pymysql小技巧
2017/06/04 Python
详解 Python 读写XML文件的实例
2017/08/02 Python
PyQt5实现拖放功能
2018/04/25 Python
python中logging模块的一些简单用法的使用
2019/02/22 Python
Python 多个图同时在不同窗口显示的实现方法
2019/07/07 Python
.dcm格式文件软件读取及python处理详解
2020/01/16 Python
使用Python来做一个屏幕录制工具的操作代码
2020/01/18 Python
在CentOS7下安装Python3教程解析
2020/07/09 Python
详解HTML5 录音的踩坑之旅
2017/12/26 HTML / CSS
htnl5利用svg页面高斯模糊的方法
2018/07/20 HTML / CSS
应用数学自荐书范文
2013/11/24 职场文书
酒店led欢迎词
2014/01/09 职场文书
工作目标责任书
2014/07/23 职场文书
门面房租房协议书
2014/12/01 职场文书
部队个人年终总结
2015/03/02 职场文书
2015年银行信贷员工作总结
2015/05/19 职场文书
Redis读写分离搭建的完整步骤
2021/09/14 Redis