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 09 Python
Python实现简单的代理服务器
Jul 25 Python
Python利用pandas计算多个CSV文件数据值的实例
Apr 19 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
Python如何爬取实时变化的WebSocket数据的方法
Mar 09 Python
Python爬虫 bilibili视频弹幕提取过程详解
Jul 31 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
Python单链表原理与实现方法详解
Feb 22 Python
python安装后的目录在哪里
Jun 21 Python
使用python编写一个语音朗读闹钟功能的示例代码
Jul 14 Python
python实现学生管理系统开发
Jul 24 Python
python uuid生成唯一id或str的最简单案例
Jan 13 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执行速度全攻略(上)
2006/10/09 PHP
php && 逻辑与运算符使用说明
2010/03/04 PHP
深入PHP curl参数的详解
2013/06/17 PHP
php表单请求获得数据求和示例
2014/05/15 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
PHP下 Mongodb 连接远程数据库的实例代码
2017/08/30 PHP
极酷的javascirpt,让你随意编辑任何网页
2007/02/25 Javascript
js 异步处理进度条
2010/04/01 Javascript
人人网javascript面试题 可以提前实现下
2012/01/05 Javascript
mailto的使用技巧分享
2012/12/21 Javascript
jQuery瀑布流插件Wookmark使用实例
2014/04/02 Javascript
js获取json元素数量的方法
2015/01/27 Javascript
JavaScript类型系统之Object详解
2016/01/07 Javascript
JavaScript Math 对象常用方法总结
2016/04/28 Javascript
AngularJS实用开发技巧(推荐)
2016/07/13 Javascript
AngularJS基础 ng-class-odd 指令示例
2016/08/01 Javascript
JS实现列表的响应式排版(推荐)
2016/09/01 Javascript
BootStrapValidator初使用教程详解
2017/02/10 Javascript
js获取地址栏参数的两种方法
2017/06/27 Javascript
JS实现电话号码的字母组合算法示例
2019/02/26 Javascript
详解Vue 全局变量,局部变量
2019/04/17 Javascript
原生js实现轮播图特效
2020/05/04 Javascript
vue 单页应用和多页应用的优劣
2020/10/22 Javascript
[01:18:36]LGD vs VP Supermajor 败者组决赛 BO3 第一场 6.10
2018/07/04 DOTA
python实现图片处理和特征提取详解
2017/11/13 Python
python爬虫_实现校园网自动重连脚本的教程
2018/04/22 Python
如何通过python实现IOU计算代码实例
2020/11/02 Python
Python爬虫进阶之爬取某视频并下载的实现
2020/12/08 Python
python 如何把docker-compose.yaml导入到数据库相关条目里
2021/01/15 Python
北美Newegg打造的全球尖货海购平台:tt海购
2018/09/28 全球购物
早读迟到检讨书
2014/01/24 职场文书
篮球比赛拉拉队口号
2014/06/10 职场文书
酒店仓管员岗位职责
2015/04/01 职场文书
2019年新郎保证书3篇
2019/10/17 职场文书
德生BCL3000抢先使用感受和评价
2022/04/07 无线电
基于Python编写一个监控CPU的应用系统
2022/06/25 Python