假期python复习3
装饰器进阶
带参数的装饰器
500个函数
@wrapper要500遍
@timmer_out(FLAGE)
def timmer_out(flag):
def timmer(func):
def inner(*args, **kwargs):
if flag:
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print(end - start)
return ret
else:
ret = func(*args, **kwargs)
return ret
return inner
return timmer
首先是执行函数timmer_out(FLAGE)然后返回timmer
前面的@加返回的timmer构造语法糖
过程为timmer_out(FLAG) == timmer
@timmer == wahaha = timmer(wahaha)
多了一个参数,多次调用
可以理解为
timmer = timmer_out(FLAGE)
然后@timmer原理一样
这样可以控制装饰器是否使用并且可以控制多个装饰器
# 带参数的装饰器
# 500个函数
import time
FLAGE = True
def timmer_out(flag):
def timmer(func):
def inner(*args, **kwargs):
if flag:
start = time.time()
ret = func(*args, **kwargs)
end = time.time()
print(end - start)
return ret
else:
ret = func(*args, **kwargs)
return ret
return inner
return timmer
# FLAGE = False
@timmer_out(FLAGE)
def wahaha():
time.sleep(0.1)
print("wahaha")
@timmer_out(FLAGE)
def erguotou():
time.sleep(0.5)
print('erguotou')
wahaha()
erguotou()
一个函数被多个装饰器装饰
流程:
先运行第一个装饰器运行到被装饰函数之前的代码
在运行第二个装饰器运行到被装饰函数之前的代码
运行被装饰函数
在运行第二个装饰器运行被装饰函数之后的代码
在运行第一个装饰器运行被装饰函数之后的代码
语法糖先执行离函数近的
所以下面列子先执行wrapper1在执行wrapper2
# 多个装饰器装饰一个函数
def wrapper1(func):
def inner1():
print("wrapper 1 before func------")
func() # --->func()
print('warpper 1 after func------')
return inner1
def wrapper2(func):
def inner2():
print("wrapper 2 before func------")
func() # innner1()
print('warpper 2 after func------')
return inner2
@wrapper2 # f = wrapper2(f) ---> wrapper2(inner1) == inner2
@wrapper1 # f = wrapper1(f) = inner1
def func():
print('in func')
func() # ---->inner2()
记录用户的登入日志
计算这个函数的执行时间
如果这样要先写用户的登入日志装饰器在使用执行时间的装饰器