Python多层装饰器用法实例分析
作者:路虽远在路上 发布时间:2023-08-20 07:34:35
标签:Python,多层装饰器
本文实例讲述了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程序设计有所帮助。
来源:http://blog.csdn.net/u010185894/article/details/71191811


猜你喜欢
- 项目说明开发php项目管理系统,由于是新项目且已经部署在生产环境,导致需要根据实际使用情况,进行及时的功能升级或bug修复。每次升级,进行程
- re.group()用法在正则表达式中,re.group()方法是用来提取出分组截获的字符串,匹配模式里的括号用于分组。举例说明:#!/us
- 下面是一个实战项目的结果。 #coding: utf-8 import Image,ImageDraw,ImageFont,os,strin
- 前言最近在研究怎么对图片资源进行无损压缩,网上也找了一些资料。总而言之,收获不少,所以想对最近的学习做个总结。无损压缩其实是相对而言的,目的
- 窗口函数OVER (PARTITION BY xxx ORDER BY xxx ASC/DESC)测试数据表及数据测试表 employeeC
- 1. 创建shell脚本 vim backupdb.sh 创建脚本内容如下: #!/bin/sh db_user="root&qu
- 本文介绍了redis之django-redis的简单缓存使用,分享给大家,具体如下:自定义连接池这种方式跟普通py文件操作redis一样,代
- torch.flatten(x)等于torch.flatten(x,0)默认将张量拉成一维的向量,也就是说从第一维开始平坦化,t
- 引子使用Django在服务器端写了一个API,返回一个JSON数据。使用Ajax调用该API:<!DOCTYPE HTML>&l
- 在Python 中有几种方法可以读取文本文件。在本文中,我将介绍 open() 函数、read() 方法、re
- 使用Pyinstaller打包整个项目今天真的被Pyinstaller给坑到了!!!本文利用spec文件进行对整个项目进行打包,直接输入命令
- 本文实例讲述了Python实现读写INI配置文件的方法。分享给大家供大家参考,具体如下:# -*- coding: utf-8 -*-imp
- 利用python pyheatmap包绘制热力图,供大家参考,具体内容如下import matplotlib.pyplot as pltfr
- Dataframe使用loc取某几行几列的数据:print(df.loc[0:4,['item_price_level',&
- 析构函数:当某个对象成为垃圾或者当对象被显式销毁时执行。GC(Garbage Collector) 在PHP中,没有任何变量指向这个对象时,
- 1、处理列表的部分元素称之为切片,创建切片,可指定要使用的第一个元素和最后一个元素的索引。2、这让Python创建一个始于第一个元素,终止于
- 一. 官网下载MySQL官方网址:(https://www.mysql.com/) 或者点击这里下载:https://www.jb
- 废话不多说了,直接把我写的timeit函数分享给大家,具体内容如下:/** * Compute the delay to execute a
- MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,增加默认MYSQL连接数的方法有两
- 问题tensor详细数值 不能直接print打印:import tensorflow as tfx = tf.constant(1)prin