一、定义:
装饰器是一个函数,该函数用来帮助装饰其他函数,它可以让原函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象。
二、简单装饰器:
需求:编写一个登录验证函数:、
def timer(func):
def bar():
print('开始计时')
func()
print('结束计时')
return bar
@timer
def test1():
print('1223')
@timer
def test2():
print('saaa')
#timer=timer(test1)
test2();
注:函数time就是装饰器,它把真正的业务方法test1和test2包裹在函数里面,看起来像test1和test2被上下时间函数装饰了。
@符号是装饰器的语法糖,在定义函数的时候使用,避免再一次赋值操作
三、带参数的被装饰器函数
def timer(func):
def bar(x,y):
print('开始计时')
func(x,y)
print('结束计时')
return bar
@timer
def test1(a,b):
print(a+b)
test1(3,5);
不定长参数
def timer(func):
def bar(*x,**y):
print('开始计时')
func(*x,**y)
print('结束计时')
return bar
@timer
def test1(*a,**b):
total=0;
for i in a:
total+=i
print(total)
test1(3,5,6,8)
四、带参数的装饰器
顾名思义:装饰器本质上还是函数,所以他应该也能带参数
def timer2(types='false'):
def timer(func):
def bar(*x,**y):
print('开始计时')
func(*x,**y)
print('结束计时')
if types == 'true':
print('方法二')
return bar
return timer
@timer2('false')
def test1(*a,**b):
total=0;
for i in a:
total+=i
print(total)
@timer2('true')
def test2(*a,**b):
# total=0;
# for i in a:
# total+=i
print('方式二肯定')
test1(3,5,6,8)
test2(3,5,6,8)
根据改变装饰传值来判断是否执行相应的代码