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中replace方法实例分析
Aug 20 Python
Python中不同进制的语法及转换方法分析
Jul 27 Python
python深度优先搜索和广度优先搜索
Feb 07 Python
VScode编写第一个Python程序HelloWorld步骤
Apr 06 Python
基于Django URL传参 FORM表单传数据 get post的用法实例
May 28 Python
在OpenCV里使用特征匹配和单映射变换的代码详解
Oct 23 Python
wxpython绘制圆角窗体
Nov 18 Python
用Python去除图像的黑色或白色背景实例
Dec 12 Python
Selenium向iframe富文本框输入内容过程图解
Apr 10 Python
浅析PyCharm 的初始设置(知道)
Oct 12 Python
Python爬虫+tkinter界面实现历史天气查询的思路详解
Feb 22 Python
Python中使用subprocess库创建附加进程
May 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
[FAQ]PHP中的一些常识:类篇
2006/10/09 PHP
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
php 根据URL下载远程图片、压缩包、pdf等文件到本地
2019/07/26 PHP
php实现推荐功能的简单实例
2019/09/29 PHP
Sample script that displays all of the users in a given SQL Server DB
2007/06/16 Javascript
jquery 打开窗口返回值实现代码
2010/03/04 Javascript
JS实现仿google、百度搜索框输入信息智能提示的实现方法
2015/04/20 Javascript
JavaScript简单修改窗口大小的方法
2015/08/03 Javascript
javascript中for/in循环及使用技巧
2015/09/01 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
javascript时间戳和日期字符串相互转换代码(超简单)
2016/06/22 Javascript
第一次接触神奇的Bootstrap网格系统
2016/07/27 Javascript
JS身份证信息验证正则表达式
2017/06/12 Javascript
关于Stream和Buffer的相互转换详解
2017/07/26 Javascript
浅谈vue.js中v-for循环渲染
2017/07/26 Javascript
js实现微信/QQ直接跳转到支付宝APP打开口令领红包功能
2018/01/09 Javascript
前端防止用户重复提交js实现代码示例
2018/09/07 Javascript
详解React之key的使用和实践
2018/09/29 Javascript
jquery实现自定义树形表格的方法【自定义树形结构table】
2019/07/12 jQuery
在Python中调用ggplot的三种方法
2015/04/08 Python
pygame实现烟雨蒙蒙下彩虹雨
2019/11/11 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
python爬虫使用正则爬取网站的实现
2020/08/03 Python
美国Jeep配件购物网站:Morris 4×4 Center
2019/05/01 全球购物
美国名表在线商城:Ashford(支持中文)
2019/09/24 全球购物
LACOSTE波兰官网:Polo衫、服装和鞋类
2020/09/29 全球购物
编程用JAVA解析XML的方式
2013/07/07 面试题
基层干部2014全国两会学习心得体会
2014/03/10 职场文书
给学校建议书范文
2014/05/13 职场文书
意外伤害赔偿协议书范本
2014/09/28 职场文书
自主招生学校推荐信范文
2015/03/26 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
面试提问mysql一张表到底能存多少数据
2022/03/13 MySQL
SpringCloud Feign请求头删除修改的操作代码
2022/03/20 Java/Android
Python利用capstone实现反汇编
2022/04/06 Python
MySQL池化框架学习接池自定义
2022/07/23 MySQL