【python】装饰器小结(被装饰函数有无返回值情况,保留被装饰函数信息)

    技术2023-10-14  68

    every blog every motto: Light tomorrow with today.

    0. 前言

    本文主要介绍,被装饰函数有/无返回值两种情况和保留被装饰函数信息等问题。 装饰器说的直白点,就是在不改变原有函数的的情况下,给函数增加新的功能。 其中,装饰器也是一个函数。 使用场景: 插入日志、性能测试、事务处理、缓存、权限校验等。 说明: 本文以最常见的测试函数运行时间举例

    1. 正文

    1.1被装饰函数无返回值

    装饰器:

    import time def count_time(func): """装饰器:计算程序运行时间""" def wrapper(*args, **kwargs): t1 = time.time() func(*args, **kwargs) t2 = time.time() # 计算时间 time_consumed = t2 - t1 print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed)) return wrapper

    用@符号对(无返回值)函数进行装饰

    @count_time def sum_n(n): """求和""" sum = 0 for i in range(n): sum += i print('-----------sum:', sum)

    主程序

    def main(): temp = sum_n(1111150) if __name__ == '__main__': main()

    1.2被装饰函数有返回值

    装饰器

    import time def count_time(func): """装饰器:计算程序运行时间""" def wrapper(*args, **kwargs): t1 = time.time() res = func(*args, **kwargs) t2 = time.time() # 计算时间 time_consumed = t2 - t1 print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed)) return res return wrapper

    被装饰函数

    @count_time def sum_n(n): """求和""" sum = 0 for i in range(n): sum += i print('-----------sum:', sum) return sum

    主程序

    def main(): n = 1111150 temp = sum_n(n) print('1到{}的和为:{}'.format(n, temp)) if __name__ == '__main__': main()

    1.3 保留被装饰函数的属性信息(函数名、帮助文档等)

    未做处理前:

    import time def count_time(func): """装饰器:计算程序运行时间""" def wrapper(*args, **kwargs): t1 = time.time() res = func(*args, **kwargs) t2 = time.time() # 计算时间 time_consumed = t2 - t1 print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed)) return res return wrapper @count_time def sum_n(n): """ 对传进来的n,从1开始求和,并返回结果 :param n: 传进的n :return: 返回求和后的结果 """ sum = 0 for i in range(n): sum += i print('-----------sum:', sum) return sum def main(): n = 1111150 temp = 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 functools def count_time(func): """装饰器:计算程序运行时间""" @functools.wraps(func) # 保留被装饰函数信息 def wrapper(*args, **kwargs): t1 = time.time() res = func(*args, **kwargs) t2 = time.time() # 计算时间 time_consumed = t2 - t1 print('{}函数一共花费了{}秒'.format(func.__name__, time_consumed)) return res return wrapper @count_time def sum_n(n): """ 对传进来的n,从1开始求和,并返回结果 :param n: 传进的n :return: 返回求和后的结果 """ sum = 0 for i in range(n): sum += i print('-----------sum:', sum) return sum def main(): n = 1111150 temp = 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

    Processed: 0.081, SQL: 10