【python】装饰器小结(被装饰函数有/无返回值情况,保留被装饰函数信息)
every blog every motto: Light tomorrow with today.
0. 前言
本文主要介绍,被装饰函数有/无返回值两种情况和保留被装饰函数信息等问题。
装饰器说的直白点,就是在不改变原有函数的的情况下,给函数增加新的功能。
其中,装饰器也是一个函数。
使用场景: 插入日志、性能测试、事务处理、缓存、权限校验等。
说明: 本文以最常见的测试函数运行时间举例
1. 正文
1.1被装饰函数无返回值
装饰器:
import timedef count_time(func):"""装饰器:计算程序运行时间"""def wrapper(*args, **kwargs):t1 = time.time()func(*args, **kwargs)t2 = time.time()# 计算时间time_consumed = t2 - t1print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed))return wrapper
用@符号对(无返回值)函数进行装饰
@count_time
def sum_n(n):"""求和"""sum = 0for i in range(n):sum += iprint('-----------sum:', sum)
主程序
def main():temp = sum_n(1111150)if __name__ == '__main__':main()
1.2被装饰函数有返回值
装饰器
import timedef count_time(func):"""装饰器:计算程序运行时间"""def wrapper(*args, **kwargs):t1 = time.time()res = func(*args, **kwargs)t2 = time.time()# 计算时间time_consumed = t2 - t1print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed))return resreturn wrapper
被装饰函数
@count_time
def sum_n(n):"""求和"""sum = 0for i in range(n):sum += iprint('-----------sum:', sum)return sum
主程序
def main():n = 1111150temp = sum_n(n)print('1到{}的和为:{}'.format(n, temp))if __name__ == '__main__':main()
1.3 保留被装饰函数的属性信息(函数名、帮助文档等)
未做处理前:
import timedef count_time(func):"""装饰器:计算程序运行时间"""def wrapper(*args, **kwargs):t1 = time.time()res = func(*args, **kwargs)t2 = time.time()# 计算时间time_consumed = t2 - t1print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed))return resreturn wrapper@count_time
def sum_n(n):"""对传进来的n,从1开始求和,并返回结果:param n: 传进的n:return: 返回求和后的结果"""sum = 0for i in range(n):sum += iprint('-----------sum:', sum)return sumdef main():n = 1111150temp = sum_n(n)print('1到{}的和为:{}'.format(n, temp))print('-----------------------------------')print('函数名:', sum_n.__name__) # 查看函数名print('显示帮助文档信息:')help(sum_n) # 查看帮助文档print('-----------------------------------')if __name__ == '__main__':main()
可以发现函数名、帮助文档都被改变结果如下图所示:
处理后,
import time
import functoolsdef count_time(func):"""装饰器:计算程序运行时间"""@functools.wraps(func) # 保留被装饰函数信息def wrapper(*args, **kwargs):t1 = time.time()res = func(*args, **kwargs)t2 = time.time()# 计算时间time_consumed = t2 - t1print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed))return resreturn wrapper@count_time
def sum_n(n):"""对传进来的n,从1开始求和,并返回结果:param n: 传进的n:return: 返回求和后的结果"""sum = 0for i in range(n):sum += iprint('-----------sum:', sum)return sumdef main():n = 1111150temp = sum_n(n)print('1到{}的和为:{}'.format(n, temp))print('-----------------------------------')print('函数名:', sum_n.__name__) # 查看函数名print('显示帮助文档信息:')help(sum_n) # 查看帮助文档print('-----------------------------------')if __name__ == '__main__':main()
保留了函数信息,结果如下图所示:
参考文献
[1] https://blog.csdn.net/TangHuanan/article/details/45094497?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
[2] https://blog.csdn.net/xiangxianghehe/article/details/77170585?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-2.nonecase
[3] https://blog.csdn.net/y_yang666/article/details/86737541
[4] https://blog.csdn.net/sheqianweilong/article/details/89787944
[5] https://blog.csdn.net/tryhardsilently/article/details/90767627
【python】装饰器小结(被装饰函数有/无返回值情况,保留被装饰函数信息)相关推荐
- python函数参数定义顺序_Python函数定义-位置参数-返回值
原标题:Python函数定义-位置参数-返回值 1 函数介绍 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多 ...
- python write函数参数_Python函数-函数参数、返回值
函数 1.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫 做subroutine(子过 ...
- C++函数的定义、函数返回值和参数类型、函数重载、重载函数等。
一.函数 1.何为函数? 能够执行一个功能的可复用的用大括号括起来的代码块: 2.按照函数的拥有者进行分类: 预定义函数:头文件中提供的预定义函数(内置):用户可以直接调用: 自定义函数:用户根据需要 ...
- C语言入门---函数类型与返回值(int和void)
int和void的区别? 哈喽,各位小伙伴们,在我们学习C语言的过程中经常会看到书中的main函数前带有int和void,就像下面这样: 上面这两种有什么区别呢?在C语言中,可以把函数分为有返回值函数 ...
- 廖雪峰python教程学习:装饰器@小结
装饰器@小结 廖雪峰老师的python教程 在代码运行期间动态增加功能的方式,称为装饰器 本质上,装饰器是一个可以返回函数的高阶函数 最基本的可以定义如下: def log(func):@functo ...
- Python-decorator装饰器小结
基本概念 具体概念自己google 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理, Web权限校验, Cache等. 很有名的例子,就是咖啡,加糖 ...
- Python-进阶-装饰器小结
基本概念 具体概念自己google 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理, Web权限校验, Cache等. 很有名的例子,就是咖啡,加糖 ...
- 视图请求限定装饰器-101.课时101.【Django视图高级】限制请求method装饰器(Av61533158,P101)
常用的请求方式有 get post 如果希望对某个视图的请求方式进行限定 可以使用装饰器限定一下 限定视图只允许get请求 方式一: 导入函数 限定请求 通过装饰器的方式来限定 方式二: 限定只允许使 ...
- python函数参数学习_python学习笔记-11.函数参数和返回值进阶
1. 函数参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式: 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是 ...
- python一个函数调用另一个函数的返回值_python-调用另一个函数后立即从函数返回...
函数calculate_attribute不返回值:它只能通过副作用起作用. 通常在该函数中,我必须写以下几行: print('some message') set_attribute(value) ...
最新文章
- 网页中的盒模型css属性,详解CSS中的Box Model盒属性的使用
- apache 模块编译选项
- python 调用c++ 回调函数
- 首发:徐亦达团队新论文推荐(ECCV2020):端到端多人多视角3d动态匹配网络
- [matlab]斜阶梯式长条引起的重力异常计算
- 游戏动词和宾语设计案例精选
- 交换两个数 不使用中间变量
- Flex4序列号 adobe flash builder 4 序列号
- SpringBoot多种自定义错误页面方式
- 打字测试软件 tt,TT打字测试软件
- 在eclipse部署OpenBravo项目
- centos7用html5播放器,centos7安装多媒体播放器SMPlayer
- APP的包名和签名获取工具
- CTFd运维-CTFd平台搭好后,遇到网页访问慢,卡顿非常厉害的解决方法
- python win32gui+pynput 自动回复qq消息
- Springboot餐饮点餐系统毕业设计源码301749
- wow Onyxia
- 整数a关于模m的乘法逆元
- Office 2013 中使用 MathType
- 02- ElasticSearch(简称ES)- 文档批量操作
热门文章
- springmvc获取原生servletAPI
- html文本框部分字体变颜色,实现文本框内,部分字体颜色、字号等自定义
- 装错信封输出所有结果C语言算法,装错信封问题(数学应用题)
- postman rpc本地调用_什么是RPC,你知道嘛?
- c语言 数组指针函数,C语言:数组 指针 函数
- java工程师面试几百问_不是吧?面试被问了几百遍的JVM,你还搞不清楚?
- sublime text3怎么运行python代码_sublime text3 怎么配置、运行python
- python opcua_理解python中的免费OPC/UA代码
- Javascript特效:利用封装动画函数模拟关闭安全管家弹窗
- python控制台小游戏代码_python小游戏实现代码