一:作用
在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码
二、语法
def 装饰器函数名():
pass
@装饰器函数名
def test():
pass
三、举例子
两个功能函数 test1, test2
遵循 “开放封闭原则”,
已经写好的代码,尽可能不要修改。
如果想要新增功能,在原先代码基础上,单独进行扩展
函数功能遵循单一原则。
注意:装饰器的执行时间是立即执行
例子:
def checkLogin(func):
def inner():
print("验证....")
func()
return inner
@checkLogin
def test1():
print("test1")
@checkLogin
def test2():
print("test2")
# 相关的逻辑代码
btnIndex =1
if btnIndex == 1:
test1()
else:
test2()
四、装饰器进阶
装饰器叠加:从上到下装饰,从下到上执行。
def zhaungshiqi_line(func):
def inner():
print("--------------------------")
func()
return inner
def zhaungshiqi_star(func):
def inner():
print("***************************")
func()
return inner
@zhaungshiqi_line
@zhaungshiqi_star
def print_connent():
print("hello world")
对有参函数进行装饰:
无论什么场景,保证函数调用参数个数一致,为了通用,可以使用不定长参数, 结合 拆包操作进行处理
def zsq(func):
def inner(*args, **kwargs):
print(args, kwargs)
func(*args, **kwargs)
return inner
@zsq # add = zsq(add)
def pnum(num):
print(num)
# 不定长参数
@zsq # pnum2= zsq(add)
def pnum2(num1, num2, num3):
print(num1,num2, num3)
pnum2(10, 234, num3=666)
执行顺序图
*对有返回值的函数进行装饰
无论什么场景,保证函数返回值一致
def zsq(func):
def inner(*args, **kwargs):
# print(args, kwargs)
res = func(*args, **kwargs)
return res
return inner
@zsq # add = zsq(add)
def pnum(num):
print(num)
# 不定长参数
@zsq # add = zsq(add)
def pnum2(num1, num2, num3):
print(num1, num2, num3)
return num1 + num2 + num3
res = pnum(50)
res1 = pnum2(10, 234, num3=666)
print(res, res1)
带有参数的装饰器****
通过@装饰器(参数)的方式,调用这个函数,并传递参数,并把返回值,再次当做装饰器进行使用
'''
无参无返回的装饰器,想打印不同的内容出现冗余代码
'''
def zsq(func):
def inner():
print("----"*30)
func()
return inner
def zsq1(func):
def inner():
print("==="*30)
func()
return inner
def zsq2(func):
def inner():
print("****"*30)
func()
return inner
@zsq
def f1():
print("666")
f1()
'''
有参有返回的装饰器
'''
def getzsq(char):
def zsqnew(func):
def inner():
print(char * 30)
func()
return inner
return zsqnew
@getzsq("#")
def f2():
print("666")
f2()