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使用在线API查询IP对应的地理位置信息实例
Jun 01 Python
Python中实现常量(Const)功能
Jan 28 Python
pymongo实现多结果进行多列排序的方法
May 16 Python
python使用正则表达式匹配字符串开头并打印示例
Jan 11 Python
Python Tkinter实现简易计算器功能
Jan 30 Python
Pandas读取MySQL数据到DataFrame的方法
Jul 25 Python
Python中staticmethod和classmethod的作用与区别
Oct 11 Python
python 将字符串完成特定的向右移动方法
Jun 11 Python
python中字符串数组逆序排列方法总结
Jun 23 Python
PyTorch预训练的实现
Sep 18 Python
简单了解python中的f.b.u.r函数
Nov 02 Python
tensorflow没有output结点,存储成pb文件的例子
Jan 04 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
编写漂亮的代码 - 将后台程序与前端程序分开
2008/04/23 PHP
php XMLWriter类的简单示例代码(RSS输出)
2011/09/30 PHP
解决FLASH需要点击激活的代码
2006/12/20 Javascript
读jQuery之十四 (触发事件核心方法)
2011/08/23 Javascript
浅析LigerUi开发中谨慎载入common.css文件
2013/07/09 Javascript
在子窗口中关闭父窗口的一句代码
2013/10/21 Javascript
javascript 获取HTML DOM父、子、临近节点
2014/06/16 Javascript
javascript实现动态模态绑定grid过程代码
2014/09/22 Javascript
Node.js的环境安装配置(使用nvm方式)
2016/10/11 Javascript
微信小程序 视图层(xx.xml)和逻辑层(xx.js)详细介绍
2016/10/13 Javascript
JS监控关闭浏览器操作的实例详解
2017/09/12 Javascript
react-native使用leanclound消息推送的方法
2018/08/06 Javascript
boostrap模态框二次弹出清空原有内容的方法
2018/08/10 Javascript
详解Ubuntu安装angular-cli遇到的坑
2018/09/08 Javascript
Bootbox将后台JSON数据填充Form表单的实例代码
2018/09/10 Javascript
微信小程序开发之点击按钮退出小程序的实现方法
2019/04/26 Javascript
Django基础之Model操作步骤(介绍)
2017/05/27 Python
Python实现计算圆周率π的值到任意位的方法示例
2018/05/08 Python
python递归函数绘制分形树的方法
2018/06/22 Python
python定向爬虫校园论坛帖子信息
2018/07/23 Python
Python中return self的用法详解
2018/07/27 Python
python django model联合主键的例子
2019/08/06 Python
Python opencv相机标定实现原理及步骤详解
2020/04/09 Python
浅析Python 中的 WSGI 接口和 WSGI 服务的运行
2020/12/09 Python
使用HTML5的表单验证的简单示例
2015/09/09 HTML / CSS
国际书籍零售商:Wordery
2017/11/01 全球购物
大学生简历的个人自我评价
2013/12/04 职场文书
中专生求职自荐信范文
2013/12/22 职场文书
公司行政经理岗位职责
2013/12/24 职场文书
拖鞋店创业计划书
2014/01/15 职场文书
网上卖盒饭创业计划书
2014/01/26 职场文书
电子商务专业学生职业生涯规划
2014/03/07 职场文书
社区文化建设方案
2014/05/02 职场文书
结婚保证书
2015/01/16 职场文书
2015年党支部公开承诺书
2015/01/22 职场文书
导游词之麻姑仙境
2019/11/18 职场文书