装饰器
装饰器就是先封装一个功能函数,像钢铁侠的衣服一样,需要的时候直接套上,就可以使用它的功能了。当然这个衣服是随时可以根据改进的。
运用场景:1. 引⼊⽇志
2. 函数执⾏时间统计
3. 执⾏函数前预备处理4. 执⾏函数后清理功能
5. 权限校验等场景
6. 缓存等等等等等
基础版实现代码:
import time # 封装计时函数,放一个参数,来传入外部函数 '''钢铁侠的皮''' def time_spend(func): ''' 定义取到外部函数时执行的操作: 1、调用time函数,分别设开始时间,结束时间 2、调用外部函数,放在俩时间点中间 3、打印耗时 4、返回响应执行操作的函数 ''' def call_func(*args,**kwargs): start_time = time.time() func() end_time = time.time() print('耗时: %.5f' % (end_time-start_time)) return call_func '''钢铁侠本侠''' @time_spend def num(): for i in range(1000): print('小可爱') # 调用函数 num() 运行结果: ... 小可爱 小可爱 耗时: 0.04397
这就是一个简单的计时函数的运用。此时被装饰的函数是无参函数。(这里的装饰器和被装饰的函数都是
无参的)
可以理解为,计时函数好比是衣服 , 有需要的人只要在头顶加一个@路由 指引衣柜的位置,直接去穿这身儿衣服就行。
升级版实现代码:
1 、 被装饰函数传参
我们都用上面的代码,好对比
import time '''钢铁侠的皮''' def time_spend(func): # 2 为了防止被装饰函数传入不定长的参数,还得重复修改, # 干脆一开始就使用形参:*args,**kwargs,随便传 def call_func(*args,**kwargs): start_time = time.time() func(*args,**kwargs) end_time = time.time() print('耗时: %.12f' % (end_time-start_time)) return call_func '''钢铁侠本侠''' @time_spend # 1 带参的被装饰函数 def num(a,b): for i in range(b): print(a+i) # 3 调用函数并传参 num(1000,100)
运行结果: ... 1098 1099 耗时: 0.00099
三个小改动, num变成了带参函数~~~
1 带参的被装饰函数
2 装饰器中:为了防止被装饰函数传入不定长的参数,还得重复修改, 干脆一开始就使用形参:*args,**kwargs, 随便传什么参数
3 由于函数带参数, 调用时,我们输俩数字做测试
小小小小总结: 带参的函数~ 就是在调用的时候,需要传参(emm不用装饰器调用时也得传,这里是废话没错),需要注意的是在接收参数的地方设置形参,后续装饰器用起来就不用重复修改了 。 装饰器内调用函数func(*args,**kwargs)当然也需要形参了
2、 装饰器传参