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 02 Python
python 字典中文key处理,读取,比较方法
Jul 06 Python
python中正则表达式 re.findall 用法
Oct 23 Python
使用Python实现从各个子文件夹中复制指定文件的方法
Oct 25 Python
Python3爬虫学习之将爬取的信息保存到本地的方法详解
Dec 12 Python
python和mysql交互操作实例详解【基于pymysql库】
Jun 04 Python
python实现的生成word文档功能示例
Aug 23 Python
Python实现代码统计工具
Sep 19 Python
python使用beautifulsoup4爬取酷狗音乐代码实例
Dec 04 Python
通过python实现windows桌面截图代码实例
Jan 17 Python
Jupyter notebook无法导入第三方模块的解决方式
Apr 15 Python
浅谈keras中自定义二分类任务评价指标metrics的方法以及代码
Jun 11 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
PHP4中实现动态代理
2006/10/09 PHP
php文件上传表单摘自drupal的代码
2011/02/15 PHP
php采用curl访问域名返回405 method not allowed提示的解决方法
2014/06/26 PHP
PHP CURL或file_get_contents获取网页标题的代码及两者效率的稳定性问题
2015/11/30 PHP
搭建Vim为自定义的PHP开发工具的一些技巧
2015/12/11 PHP
php实现的SSO单点登录系统接入功能示例分析
2016/10/12 PHP
php安全配置记录和常见错误梳理(总结)
2017/03/28 PHP
JavaScript中“+=”的应用
2007/02/02 Javascript
基于jquery的tab切换 js原理
2010/04/01 Javascript
基于jquery的Repeater实现代码
2010/07/17 Javascript
jquery操作checkbox示例分享
2014/07/21 Javascript
js在数组中删除重复的元素自保留一个(两种实现思路)
2014/08/22 Javascript
js代码实现无缝滚动(文字和图片)
2015/08/20 Javascript
js实现带圆角的两级导航菜单效果代码
2015/08/24 Javascript
微信小程序 教程之注册程序
2016/10/17 Javascript
JavaScript中return用法示例
2016/11/29 Javascript
详解Vue 动态添加模板的几种方法
2017/04/25 Javascript
使用jQuery实现页面定时弹出广告效果
2017/08/24 jQuery
小程序实现录音功能
2020/09/22 Javascript
[46:47]完美世界DOTA2联赛PWL S2 FTD vs Magma 第二场 11.20
2020/11/23 DOTA
Python 分析Nginx访问日志并保存到MySQL数据库实例
2014/03/13 Python
Python搭建FTP服务器的方法示例
2018/01/19 Python
Python使用pickle模块报错EOFError Ran out of input的解决方法
2018/08/16 Python
python标记语句块使用方法总结
2019/08/05 Python
Python小白不正确的使用类变量实例
2020/05/29 Python
斯凯奇美国官网:SKECHERS美国
2016/08/20 全球购物
荷兰网上鞋店:Ziengs.nl
2017/01/02 全球购物
La Redoute英国官网:法国时尚品牌
2017/04/27 全球购物
晨会主持词
2014/03/17 职场文书
小学节能减排倡议书
2014/05/15 职场文书
捐献物资倡议书范文
2014/05/19 职场文书
职业道德模范事迹材料
2014/08/24 职场文书
2014年管理人员工作总结
2014/12/01 职场文书
公务员年终个人总结
2015/02/12 职场文书
2016消防宣传标语口号
2015/12/26 职场文书
vue如何批量引入组件、注册和使用详解
2021/05/12 Vue.js