ToB企服应用市场:ToB评测及商务社交产业平台

标题: Python底子:装饰器 [打印本页]

作者: 惊落一身雪    时间: 2024-8-15 19:27
标题: Python底子:装饰器
装饰器介绍

Python装饰器是一种特别类型的函数,它可以修改或增强其他函数的功能,而无需更改原始函数的源代码。
装饰器本质上是一个接收函数作为参数的函数,它返回一个新的函数或者修改过的原函数,通常用于插入日志、性能测试、权限校验、缓存、事务处置处罚等场景。
题目引入

我现在有一个数字求和函数:
  1. def number_sum(a, b):
  2.     sum = a + b
  3.     print(sum)
  4.     return sum
  5. number_sum(4,5)
复制代码
题目:给这个函数添加上性能测试的功能(即检测函数运行所耗的时间)但是不允许更改原函数的代码?
题目分析

检测步伐运行时间,一样平常是这样的:
  1. import time  
  2. def jiance()
  3.         start = time.time()
  4.     函数体                     
  5.     end = time.time()
  6.         print("所耗时间:", end - start,"秒")
复制代码
解决题目

没学装饰器和语法糖之前,你是这么写得:
  1. ```python                             
  2. import time                             
  3. def number_sum(a, b):                             
  4.     sum = a + b                             
  5.     print(sum)                             
  6.     return sum                             
  7. def time_js(a, b):                             
  8.     start = time.time()                             
  9.     r = number_sum(a, b)                             
  10.     time.sleep(2)            #因为太快了!为了能看到效果,这里睡觉2秒                       
  11.     print("结果为:",r)                             
  12.     end = time.time()                             
  13.     print("所耗时间:", end - start,"秒")                             
  14. time_js(5,6)                             
复制代码
运行结果:
  1. 结果为: 11
  2. 所耗时间: 2.001185894012451 秒
复制代码
优点:满足要求
缺点:不能复用
当你学了装饰器和语法糖之后是这样写得:
  1. import time
  2. def jiance(jc_time):
  3.     def wrapper(a,b):
  4.         start = time.time()
  5.         result = jc_time(a,b)
  6.         time.sleep(2)    #因为太快了!为了能看到效果,这里睡觉2秒
  7.         end = time.time()
  8.         print("所耗时间:", end - start,"秒")
  9.         return result
  10.     return wrapper
  11. @jiance
  12. def number_sum(a, b):
  13.     sum = a + b
  14.     print(sum)
  15.     return sum
  16. ss = number_sum(4,5)
复制代码
运行结果:
  1. 9
  2. 所耗时间: 2.011695146560669 秒
复制代码
优点:满足要求
缺点:只能在相同两个参数数量的情况下复用
继承改进
我们将变量换成*args
  1. import time
  2. def jiance(jc_time):
  3.     def wrapper(*args):
  4.         start = time.time()
  5.         result = jc_time(*args)
  6.         time.sleep(2)
  7.         end = time.time()
  8.         print("所耗时间:", end - start, "秒")
  9.         return result
  10.     return wrapper
  11. @jiance
  12. def number_sum2(a, b):
  13.     sum = a + b
  14.     print(sum)
  15.     return sum
  16. @jiance
  17. def number_sum3(a, b, c):
  18.     sum = a + b + c
  19.     print(sum)
  20.     return sum
  21. ss = number_sum2(4, 5)
  22. ss = number_sum3(4, 5, 6)
复制代码
运行结果:
  1. 9
  2. 所耗时间: 2.005794048309326 秒
  3. 15
  4. 所耗时间: 2.0033328533172607 秒
复制代码
优点:满足要求,可以复用

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4