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代码检查工具pylint 让你的python更规范
Sep 05 Python
Python实现的一个简单LRU cache
Sep 26 Python
Python读取ini文件、操作mysql、发送邮件实例
Jan 01 Python
Python代码调试的几种方法总结
Apr 15 Python
python检测某个变量是否有定义的方法
May 20 Python
python2.6.6如何升级到python2.7.14
Apr 08 Python
python调用百度语音REST API
Aug 30 Python
Python爬虫小技巧之伪造随机的User-Agent
Sep 13 Python
python删除文件夹下相同文件和无法打开的图片
Jul 16 Python
pandas的排序和排名的具体使用
Jul 31 Python
python socket 聊天室实例代码详解
Nov 14 Python
Python切割图片成九宫格的示例代码
Mar 10 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下escape解码函数的实现方法
2010/08/08 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
基于PHP magic_quotes_gpc的使用方法详解
2013/06/24 PHP
php另类上传图片的方法(PHP用Socket上传图片)
2013/10/30 PHP
PHP编写daemon process 实例详解
2016/11/13 PHP
PHP文件后缀不强制为.php方法
2019/03/31 PHP
phpstorm 配置xdebug的示例代码
2019/03/31 PHP
PHP面向对象程序设计中的self、static、parent关键字用法分析
2019/08/14 PHP
可缩放Reloaded-一个针对可缩放元素的复用组件
2007/03/10 Javascript
javascript的键盘控制事件说明
2008/04/15 Javascript
ExtJS 刷新后如何默认选中刷新前最后一次选中的节点
2014/04/03 Javascript
JS动态加载当前时间的方法
2015/02/09 Javascript
简介JavaScript中fixed()方法的使用
2015/06/08 Javascript
在JavaScript中操作数组之map()方法的使用
2015/06/09 Javascript
Easyui的组合框的取值与赋值
2016/10/28 Javascript
JavaScript中的 attribute 和 jQuery中的 attr 方法浅析
2017/01/04 Javascript
javascript基础知识讲解
2017/01/11 Javascript
Vue.js列表渲染绑定jQuery插件的正确姿势
2017/06/29 jQuery
浅析JS中NEW的实现原理及重写
2020/02/20 Javascript
React服务端渲染原理解析与实践
2021/03/04 Javascript
python实现获取序列中最小的几个元素
2014/09/25 Python
python插入数据到列表的方法
2015/04/30 Python
利用Python循环(包括while&for)各种打印九九乘法表的实例
2017/11/06 Python
python删除服务器文件代码示例
2018/02/09 Python
解决Mac下首次安装pycharm无project interpreter的问题
2018/10/29 Python
Pytorch 实现focal_loss 多类别和二分类示例
2020/01/14 Python
python实现替换word中的关键文字(使用通配符)
2020/02/13 Python
OpenCV 表盘指针自动读数的示例代码
2020/04/10 Python
python获取命令行参数实例方法讲解
2020/11/02 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
思想政治教育专业个人求职信范文
2013/12/20 职场文书
建筑人员岗位职责
2013/12/25 职场文书
岗位工作说明书
2014/07/29 职场文书
孙振耀退休感言
2015/08/01 职场文书
python基于OpenCV模板匹配识别图片中的数字
2021/03/31 Python
解决SpringCloud Feign传对象参数调用失败的问题
2021/06/23 Java/Android