目的:在不动原函数的情况下,对函数进行修改,比如进行权限验证。
一、无参数传递的函数加装饰器
无装饰器,使用函数进行
def add_1(a):
def add_2():
print('-'*30+'装饰权限校验')
a()
return add_2
def check1():
print('{:-^30}'.format('check1'))
check1=add_1(check1)
check1()
运行过程:将函数check1作为参数传递给add_1函数,add_1返回内层函数add_2,将内存函数add_2传递给check1,再将check1实例化,就相当于将add_2实例化运行,运行过程中先打印权限校验,再调用之前传递进来的check1函数。
打印结果:
有装饰器
def add_1(a):
def add_2():
print('-'*30+'装饰权限校验')
a()
return add_2
@add_1
def check1():
print('{:-^30}'.format('check1'))
check1()
打印结果:
两者比较,相当于 @add_1 替代了 check1 = add_1(check1) ,并且前移到函数定义之前
!!!装饰器中 a (外层函数的参数)存在的意义,让装饰器内部能够调用传入的函数!!!!
二、有参数的函数加装饰器
装饰器函数的内层函数相当于对需要装饰的函数,进行了重写,所以参数需要和被装饰的函数一致
一个参数:
def add_1(a):
def add_2(b):
print('-'*30+'装饰权限校验')
a(b)
return add_2
@add_1
def check1(num):
print('{:-^30}{}'.format('check1',num))
check1(999)
打印结果:
多个参数:使用不定长参数
def add_1(a):
def add_2(b,*args,**kwargs):
print('-'*30+'装饰权限校验')
a(b,*args,**kwargs)
return add_2
@add_1
def check1(num,*args,**kwargs):
print('{:-^30}{}'.format('check1',num))
print(args)
print(kwargs)
check1(999,11)
check1(999,11,'jj',f=1,ff=22)
打印结果:
三、有参数、有返回值的函数加装饰器
需要在原先装饰器内层函数的调用函数位置,进行返回
def add_1(a):
def add_2(*args,**kwargs):
print('-'*30+'装饰权限校验')
return a(*args,**kwargs)
return add_2
@add_1
def check1(*args,**kwargs):
print('*'*30,args)
print(kwargs,'!'*30)
return args,kwargs
print(check1(100))
打印结果:
四、对一个参数使用多个装饰器装饰
装饰顺序:先调用离被装饰函数近的装饰器,再调用离被装饰函数远的装饰器
调用函数的顺序:先调用离被装饰函数远的装饰器(最上面),再调用离被装饰函数近的装饰器(下面)
就和打包一样,打包的时候,先打包内层,再打包外层
使用打包好的东西时,先拆外层,再拆内层
def add_1(a):
def add_2(*args,**kwargs):
print('-'*30+'装饰权限校验1')
return a(*args,**kwargs)
return add_2
def bba_1(a):
def bba_2(*args,**kwargs):
print('-'*30+'装饰权限校验2')
return a(*args,**kwargs)
return bba_2
@bba_1
@add_1
def check1(*args,**kwargs):
print('*'*30,args)
print(kwargs,'!'*30)
return args,kwargs
print(check1(100))
打印结果:
五、在装饰器中传递参数
应用:权限校验分级,一级校验...二级校验
在原装饰器函数外层,在加上一层函数,接收参数,放入函数内部
在最内层对,传入的参数进行操作
def qqq(num):
def add_1(a):
def add_2(*args,**kwargs):
if num == 1:
print('-'*30+'装饰权限校验1')
elif num == 2:
print('*' * 30 + '装饰权限校验2')
else:
print('不进行校验,随意操作')
return a(*args,**kwargs)
return add_2
return add_1
@qqq(1)
def check1(*args,**kwargs):
print('*'*30,args)
print(kwargs,'!'*30)
return args,kwargs
print(check1(100))
打印结果: