1、什么是装饰器?
装饰器本身是一个函数,用来拓展其他函数的功能,
2、装饰器优势:
好处就是在不用更改原函数的代码前提下给函数增加新的功能。
3、加了装饰器的函数:
本身运行的是装饰器这个函数,被装饰的函数只是其中一部分
4、需求
要求:在不修改 index()
函数的源代码的前提下,为其添加统计运行时间的功能,有的业务功能比较复杂不能轻易修改核心代码。
5、代码实例
def index(x, y):
time.sleep(3)
print('index %s %s' % (x, y))
index(111, 222)
# index(y=111,x=222)
# index(111,y=222)
- 有参数的装饰器:*args,**kwargs满足各种参数
- 无参数的装饰器
import time
# (1) 有参数的装饰器:*args,**kwargs满足各种参数
def timmer(func):
def wrapper(*args, **kwargs):
start = time.time()
res = func(*args, **kwargs)
stop = time.time()
print("运行时间为:", stop - start)
return res
return wrapper
@timmer
def index(x, y, z):
time.sleep(3)
print(f"{x,y,z}")
print("一、把 index 函数放到装饰器里面,添加了计算时间的功能")
@timmer
def home(name):
time.sleep(2)
print("二、把 home 函数放到装饰器里面,添加了计算时间的功能")
# (2) 无参数的装饰器模板
def auth(func):
def wrapper(*args, **kwargs):
# 1、调用原函数
# 2、为其增加新功能
name = input('your name>>: ').strip()
pwd = input('your password>>: ').strip()
if name == 'egon' and pwd == '123':
res = func(*args, **kwargs)
return res
else:
print('账号密码错误')
return wrapper
@auth
def index1():
print('成功执行了index函数')
@timmer
@auth # 多个装饰器的时候,先执行最下面,再执行最上面的
def index2():
print('成功执行了index函数')
if __name__ == '__main__':
index(x=1, y=2, z=3)
home('egon')
index1()
index2()