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】装饰器小结(被装饰函数有/无返回值情况,保留被装饰函数信息)相关推荐

  1. python函数参数定义顺序_Python函数定义-位置参数-返回值

    原标题:Python函数定义-位置参数-返回值 1 函数介绍 函数在编程语言中就是完成特定功能的一个词句组(代码块),这组语句可以作为一个单位使用,并且给它取一个名字.可以通过函数名在程序的不同地方多 ...

  2. python write函数参数_Python函数-函数参数、返回值

    函数 1.函数是什么? 函数一词来源于数学,但编程中的「函数」概念,与数学中的函数是有很大不同的,编程中的函数在英文中也有很多不同的叫法.在BASIC中叫         做subroutine(子过 ...

  3. C++函数的定义、函数返回值和参数类型、函数重载、重载函数等。

    一.函数 1.何为函数? 能够执行一个功能的可复用的用大括号括起来的代码块: 2.按照函数的拥有者进行分类: 预定义函数:头文件中提供的预定义函数(内置):用户可以直接调用: 自定义函数:用户根据需要 ...

  4. C语言入门---函数类型与返回值(int和void)

    int和void的区别? 哈喽,各位小伙伴们,在我们学习C语言的过程中经常会看到书中的main函数前带有int和void,就像下面这样: 上面这两种有什么区别呢?在C语言中,可以把函数分为有返回值函数 ...

  5. 廖雪峰python教程学习:装饰器@小结

    装饰器@小结 廖雪峰老师的python教程 在代码运行期间动态增加功能的方式,称为装饰器 本质上,装饰器是一个可以返回函数的高阶函数 最基本的可以定义如下: def log(func):@functo ...

  6. Python-decorator装饰器小结

    基本概念 具体概念自己google 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理, Web权限校验, Cache等. 很有名的例子,就是咖啡,加糖 ...

  7. Python-进阶-装饰器小结

    基本概念 具体概念自己google 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理, Web权限校验, Cache等. 很有名的例子,就是咖啡,加糖 ...

  8. 视图请求限定装饰器-101.课时101.【Django视图高级】限制请求method装饰器(Av61533158,P101)

    常用的请求方式有 get post 如果希望对某个视图的请求方式进行限定 可以使用装饰器限定一下 限定视图只允许get请求 方式一: 导入函数 限定请求 通过装饰器的方式来限定 方式二: 限定只允许使 ...

  9. python函数参数学习_python学习笔记-11.函数参数和返回值进阶

    1. 函数参数和返回值的作用 函数根据有没有参数以及有没有返回值,可以相互组合,共有4种形式: 无参数,无返回值 无参数,有返回值 有参数,无返回值 有参数,有返回值 定义函数时,是否接收参数,或者是 ...

  10. python一个函数调用另一个函数的返回值_python-调用另一个函数后立即从函数返回...

    函数calculate_attribute不返回值:它只能通过副作用起作用. 通常在该函数中,我必须写以下几行: print('some message') set_attribute(value) ...

最新文章

  1. 网页中的盒模型css属性,详解CSS中的Box Model盒属性的使用
  2. apache 模块编译选项
  3. python 调用c++ 回调函数
  4. 首发:徐亦达团队新论文推荐(ECCV2020):端到端多人多视角3d动态匹配网络
  5. [matlab]斜阶梯式长条引起的重力异常计算
  6. 游戏动词和宾语设计案例精选
  7. 交换两个数 不使用中间变量
  8. Flex4序列号 adobe flash builder 4 序列号
  9. SpringBoot多种自定义错误页面方式
  10. 打字测试软件 tt,TT打字测试软件
  11. 在eclipse部署OpenBravo项目
  12. centos7用html5播放器,centos7安装多媒体播放器SMPlayer
  13. APP的包名和签名获取工具
  14. CTFd运维-CTFd平台搭好后,遇到网页访问慢,卡顿非常厉害的解决方法
  15. python win32gui+pynput 自动回复qq消息
  16. Springboot餐饮点餐系统毕业设计源码301749
  17. wow Onyxia
  18. 整数a关于模m的乘法逆元
  19. Office 2013 中使用 MathType
  20. 02- ElasticSearch(简称ES)- 文档批量操作

热门文章

  1. springmvc获取原生servletAPI
  2. html文本框部分字体变颜色,实现文本框内,部分字体颜色、字号等自定义
  3. 装错信封输出所有结果C语言算法,装错信封问题(数学应用题)
  4. postman rpc本地调用_什么是RPC,你知道嘛?
  5. c语言 数组指针函数,C语言:数组 指针 函数
  6. java工程师面试几百问_不是吧?面试被问了几百遍的JVM,你还搞不清楚?
  7. sublime text3怎么运行python代码_sublime text3 怎么配置、运行python
  8. python opcua_理解python中的免费OPC/UA代码
  9. Javascript特效:利用封装动画函数模拟关闭安全管家弹窗
  10. python控制台小游戏代码_python小游戏实现代码