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素数检测实例分析
Jun 15 Python
Python实现对百度云的文件上传(实例讲解)
Oct 21 Python
Python输出各行命令详解
Feb 01 Python
python实现二叉查找树实例代码
Feb 08 Python
pytorch 把MNIST数据集转换成图片和txt的方法
May 20 Python
python实现决策树分类(2)
Aug 30 Python
python实现剪切功能
Jan 23 Python
Python基于opencv调用摄像头获取个人图片的实现方法
Feb 21 Python
Python 实现微信防撤回功能
Apr 29 Python
200行python代码实现2048游戏
Jul 17 Python
pandas DataFrame 警告(SettingWithCopyWarning)的解决
Jul 23 Python
Pandas实现批量拆分与合并Excel的示例代码
May 30 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正则匹配汉字的方法介绍
2013/04/25 PHP
解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)
2013/06/18 PHP
javascript中用星号表示预录入内容的实现代码
2011/01/08 Javascript
强大的jquery插件jqeuryUI做网页对话框效果!简单
2011/04/14 Javascript
jquery操作select option 的代码小结
2011/06/21 Javascript
javascript中数组array及string的方法总结
2014/11/28 Javascript
28个常用JavaScript方法集锦
2015/01/14 Javascript
JQuery实现定时刷新功能代码
2017/05/09 jQuery
vue实现一个移动端屏蔽滑动的遮罩层实例
2017/06/08 Javascript
jQuery条件分页 代替离线查询(附代码)
2017/08/17 jQuery
jquery使用iscorll实现上拉、下拉加载刷新
2017/10/26 jQuery
Vue 页面切换效果之 BubbleTransition(推荐)
2018/04/08 Javascript
微信小程序自定义导航教程(兼容各种手机)
2018/12/12 Javascript
JS实现的字符串数组去重功能小结
2019/06/17 Javascript
el-input 标签中密码的显示和隐藏功能的实例代码
2019/07/19 Javascript
[01:30]我们共输赢 完美世界城市挑战赛开启全新赛季
2019/04/19 DOTA
[01:02:09]Liquid vs TNC 2019国际邀请赛淘汰赛 胜者组 BO3 第二场 8.21
2020/07/19 DOTA
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
Windows平台Python连接sqlite3数据库的方法分析
2017/07/12 Python
用python实现的线程池实例代码
2018/01/06 Python
pandas apply 函数 实现多进程的示例讲解
2018/04/20 Python
python 定时任务去检测服务器端口是否通的实例
2019/01/26 Python
python中的句柄操作的方法示例
2019/06/20 Python
python实现双色球随机选号
2020/01/01 Python
python+Selenium自动化测试——输入,点击操作
2020/03/06 Python
matplotlib设置颜色、标记、线条,让你的图像更加丰富(推荐)
2020/09/25 Python
基于css3仿造window7的开始菜单
2010/06/17 HTML / CSS
css3高级选择器使用方法
2013/12/02 HTML / CSS
新浪网技术部笔试题
2016/08/26 面试题
初中音乐教学反思
2014/01/12 职场文书
大学生活动策划方案
2014/02/10 职场文书
家具促销活动方案
2014/02/16 职场文书
2015年除四害工作总结
2015/07/23 职场文书
XX部保密工作制度范本
2019/08/27 职场文书
小学生作文之《压岁钱的烦恼》
2019/09/27 职场文书
用Java实现简单计算器功能
2021/07/21 Java/Android