目录
装饰器
-
作用
在函数名以及函数体不改变的前提下,给一个函数附加一些额外代码
-
案例
- 发说说,发图片
-
注意事项
- “开放封闭”原则 :已经写好的代码,尽可能不要修改,如果想要新增功能,在原先代码基础上,单独进行扩展。
- 装饰器的执行时间,是立即执行
-
进阶
- 装饰器叠加----从上到下装饰,从上到下装饰
- 对有参函数进行装饰----无论什么场景,保证函数调用参数个数一致,为了通用,可以使用不定长参数,集合 拆包操作进行处理。
- 对有返回值的函数进行装饰------无论什么场景,保证函数返回值一致
- 带有参数的装饰器
#案例一 根据判断发说说还是图片
#定义功能函数
def fss():
#print("登录验证。。。。")
checkLogin()
print("发说说")
def ftP():
#print("登录验证。。。。")
checkLogin()
print("发图片")
def checkLogin():
print("登录验证。。。。")
#业务逻辑代码
btnIndex = 2
if btnIndex == 1:
#print("登录验证。。。。")
fss()
else:
#print("登录验证。。。。")
ftP()
#发说说,发图片,必须有一个前提,是在用户登录之后,
#登录验证操作
#1.直接在业务逻辑代码里面去修改,添加一个验证操作
# 因为业务逻辑代码非常多,所有就造就了,每一份逻辑代码,在调用具体的功能函数之前,都需要去做有一个登录验证,这样就造成了代码冗余度比较大,代码的复用性比较差,代码的维护性比较差
#2. 直接在功能函数里面去修改,方便代码的重复使用
#改版2 使用装饰器
def checkLogin(func):
def inner():
print("登录验证。。。。")
func()
return inner
#定义功能函数
@checkLogin#fss = checkLogin(fss)
def fss():
print("发说说")
@checkLogin
def ftP():
print("发图片")
#业务逻辑代码
btnIndex = 2
if btnIndex == 1:
fss()
else:
ftP()
#输出 登录验证。。。。 发图片
#进阶 装饰器叠加 从上到下装饰,从上到下装饰
def zhuangshiqi_line(func):
def inner():
print("---------")
func()
return inner
def zhuangshiqi_star(func):
def inner():
print("*"*10)
func()
return inner
#定义功能函数
@zhuangshiqi_line #print_content = zhuangshiqi_line(print_content)
def print_content():
print("大家开心")
print_content()#输出 --------- 大家开心
#切换不同的装饰器 可以产生不同的效果
@zhuangshiqi_star
def print_content():
print("大家开心")
print_content()#输出 ********** 大家开心
#装饰器的叠加
@zhuangshiqi_line
@zhuangshiqi_star
def print_content():
print("大家开心")
print_content()#输出 --------- ********** 大家开心
#装饰器的执行逻辑
def zhuangshiqi_star(func):
def inner():
print("*"*10)
func()
return inner
#定义功能函数
def print_content():
print("大家开心")
print_content()#输出 --------- 大家开心
#@zhuangshiqi_line 等价于 print_content = zhuangshiqi_line(print_content)
#此时return inner
#就是把print_content函数体里面改造成
#print("*"*10)
#func() 等价于 print("大家开心")
#此时执行print_content函数 本质是执行 inner函数
#对有参函数进行装饰 用不定长的参数
def zsq(func):
def inner(*args,**kwargs):
print("****")
#拆包
res = func(*args,**kwargs)#func是代表pnum的 pnum此时有返回值,直接接收就可以
return res
return inner
@zsq
def pnum(num,num2,num2):
print(num,num2,num2)
return num+num2+num2
pnum(221,345,num3=666)#输出 **** 1232
pnum(999)#输出 **** None
#对有返回值的函数进行装饰
def zsq(func):
def inner(*args,**kwargs):
print("****")
#拆包
func(*args,**kwargs)
return inner
@zsq
def pnum(num):
print(num)
pnum(221,345,num3=666)#输出 **** 221 345 666
pnum(999)#输出 **** 999
#带有参数的装饰器
#getzsq的作用就是接收参数 ,并把参数传递给 inner
def getzsq(char):
def zsq(func):
def inner():
print(char * 10)
func()
return inner
return zsq
@getzsq("s")
def d1():
print(666)#输出 ssssssssss 666