# 1、无参装饰器的模板
def outter(func):
def wrapper(*args, **kwargs):
res = func(*args, **kwargs)
return res
return wrapper
# 2、叠加多个装饰器
# 2.1 加载顺序:自下而上
# 2.2 执行顺序
def deco1(func1): # func1 = wrapper2的内存地址
def wrapper1(*args, **kwargs):
print('wrapper1====>')
res1 = func1(*args, **kwargs)
return res1
return wrapper1
def deco2(func2): # func2 = wrapper3的内存地址
def wrapper2(*args, **kwargs):
print('wrapper2====>')
res2 = func2(*args, **kwargs)
return res2
return wrapper2
def deco3(func3): # func3 = 最原始的那个被装饰函数的内存地址
def wrapper3(*args, **kwargs):
print('wrapper3====>')
res3 = func3(*args, **kwargs)
return res3
return wrapper3
# index=wrapper1的内存地址
@deco1 # deco1(wrapper2的内存地址)=>wrapper1的内存地址
@deco2 # deco2(wrapper3的内存地址)=>wrapper2的内存地址
@deco3 # deco3(最原始的那个被装饰函数的内存地址)=>wrapper3的内存地址
def index(x, y):
print('index=>', x, y)
index(1, 2)
"""
wrapper1====>'
wrapper2====>
wrapper3====>
index=>1,2
"""
import time
def timer(func):
# func = index
def wrapper(*args, **kwargs):
start = time.time()
func(*args, **kwargs)
end = time.time()
print(f'run time is {end - start}')
return wrapper
def login(func):
def wrapper(*args, **kwargs):
while True:
ip_name = input('name:')
ip_psw = input('psw:')
if ip_name == 'egon' and ip_psw == '123':
print('登录成功!')
res = func(*args, **kwargs)
return res
else:
print('登录失败!')
break
return wrapper
@timer # 统计的下面的装饰器的时间
@login
def index(x, y):
time.sleep(1)
print(f'index-----> {x}, {y}')
return 123
index(111, 222)
29 叠加多个装饰器
最新推荐文章于 2021-08-17 18:23:12 发布