在函数名以及函数体不改变的前提下,给一个函数附加一些额外的代码。
面向对象,具有开放封闭原则,已经写好的代码,尽可能不要修改。如果想要新增功能,在原先代码基础上,单独进行扩展。
函数应该具有单一职责。
def checkLogin(func):
def inner():
print('登录验证')
func()
return inner
def fss():
print('发说说')
fss = checkLogin(fss)
def ftp():
print('发图片')
ftp = checkLogin(ftp)
btnIndex = 1
if btnIndex == 1:
fss()
else:
ftp()
登录验证
发说说
checkLogin可以认为是装饰器。
语法糖
@checklogin
def checkLogin(func):
def inner():
print('登录验证')
func()
return inner
@checkLogin
def fss():
print('发说说')
# fss = checkLogin(fss)
@checkLogin
def ftp():
print('发图片')
# ftp = checkLogin(ftp)
btnIndex = 1
if btnIndex == 1:
fss()
else:
ftp()
执行时间
装饰器的执行时间是立即执行
def check(func):
print('xxx')
def inner():
print('登录验证')
func()
return inner
@check
def fss():
print('发说说')
# fss = check(fss)
xxx
装饰器叠加
从上到下装饰,从下到上执行
def zhuangshiqi_line(func):
def inner():
print('--------------------')
func()
return inner
def zhuangshiqi_star(func):
def inner():
print('*' * 30)
func()
return inner
@zhuangshiqi_line
@zhuangshiqi_star
def print_content():
print('社会我顺哥')
print_content()
--------------------
******************************
社会我顺哥
对有参数的函数进行装饰
无论什么场景,保证函数调用参数个数一致,为了通用,可以使用不定长参数,结合拆包操作进行处理
def zsq(func):
def inner(*args, **kwargs):
print('_' * 30)
print(args, kwargs)
func(*args, **kwargs)
return inner
@zsq
def pnum(num, num2, num3):
print(num, num2, num3)
@zsq
def pnum2(num):
print(num)
pnum(123, 222, num3=666)
pnum2(999)
______________________________
(123, 222) {‘num3’: 666}
123 222 666
______________________________
(999,) {}
999
对有返回值的函数进行装饰
def zsq(func):
def inner(*args, **kwargs):
print('_' * 30)
print(args, kwargs)
res = func(*args, **kwargs)
return res
return inner
@zsq
def pnum(num, num2, num3):
print(num, num2, num3)
return num + num2 + num3
@zsq
def pnum2(num):
print(num)
res1 = pnum(123, 222, num3=666)
res2 = pnum2(999)
print(res1, res2)
______________________________
(123, 222) {‘num3’: 666}
123 222 666
______________________________
(999,) {}
999
1011 None
带有参数的装饰器
def getzsq(char):
def zsq(func):
def inner():
print(char * 30)
func()
return inner
return zsq
@getzsq('*')
def f1():
print('666')
f1()
******************************
666