马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
装饰器介绍
Python装饰器是一种特别类型的函数,它可以修改或增强其他函数的功能,而无需更改原始函数的源代码。
装饰器本质上是一个接收函数作为参数的函数,它返回一个新的函数或者修改过的原函数,通常用于插入日志、性能测试、权限校验、缓存、事务处置处罚等场景。
题目引入
我现在有一个数字求和函数:
- def number_sum(a, b):
- sum = a + b
- print(sum)
- return sum
- number_sum(4,5)
复制代码 题目:给这个函数添加上性能测试的功能(即检测函数运行所耗的时间)但是不允许更改原函数的代码?
题目分析
检测步伐运行时间,一样平常是这样的:
- import time
- def jiance()
- start = time.time()
- 函数体
- end = time.time()
- print("所耗时间:", end - start,"秒")
复制代码 解决题目
没学装饰器和语法糖之前,你是这么写得:
- ```python
- import time
- def number_sum(a, b):
- sum = a + b
- print(sum)
- return sum
- def time_js(a, b):
- start = time.time()
- r = number_sum(a, b)
- time.sleep(2) #因为太快了!为了能看到效果,这里睡觉2秒
- print("结果为:",r)
- end = time.time()
- print("所耗时间:", end - start,"秒")
- time_js(5,6)
复制代码 运行结果:
- 结果为: 11
- 所耗时间: 2.001185894012451 秒
复制代码 优点:满足要求
缺点:不能复用
当你学了装饰器和语法糖之后是这样写得:
- import time
- def jiance(jc_time):
- def wrapper(a,b):
- start = time.time()
- result = jc_time(a,b)
- time.sleep(2) #因为太快了!为了能看到效果,这里睡觉2秒
- end = time.time()
- print("所耗时间:", end - start,"秒")
- return result
- return wrapper
- @jiance
- def number_sum(a, b):
- sum = a + b
- print(sum)
- return sum
- ss = number_sum(4,5)
复制代码 运行结果:
- 9
- 所耗时间: 2.011695146560669 秒
复制代码 优点:满足要求
缺点:只能在相同两个参数数量的情况下复用
继承改进
我们将变量换成*args
- import time
- def jiance(jc_time):
- def wrapper(*args):
- start = time.time()
- result = jc_time(*args)
- time.sleep(2)
- end = time.time()
- print("所耗时间:", end - start, "秒")
- return result
- return wrapper
- @jiance
- def number_sum2(a, b):
- sum = a + b
- print(sum)
- return sum
- @jiance
- def number_sum3(a, b, c):
- sum = a + b + c
- print(sum)
- return sum
- ss = number_sum2(4, 5)
- ss = number_sum3(4, 5, 6)
复制代码 运行结果:
- 9
- 所耗时间: 2.005794048309326 秒
- 15
- 所耗时间: 2.0033328533172607 秒
复制代码 优点:满足要求,可以复用
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |