函数装饰器
1. 装饰器(重点, 难点)
开闭原则:
对功能的扩展开放
对代码的修改是封闭
通用装饰器语法:
def wrapper(fn):
def inner(*args, **kwargs): # 聚合
在目标函数之前
ret = fn(*arg, **kwargs) # 打散
在目标函数之后
return ret
return inner
@wrapper
def func():
pass
func()
def play(a,b) :
print("登陆",a,b)
print("我卢本伟没有开挂")
print("我29杀吃鸡")
print("我无中生友秀的一批")
def wrapper(fn):
def inner(*args,**kwargs) :
print("我先打开外挂")
print("打开直播")
fn(*args,**kwargs)
print("关闭外挂")
return inner
play = wrapper(play)
play("卢本伟","abc")
2. 同一个函数被多个装饰器装饰
@wrapper1
@wrapper2
@wrapper3
def func():
pass
func() >>> ( 1 2 3 func 3 2 1 )
3. 带参数的装饰器()
def wrapper_out(参数):
def wrapper(fn):
def inner(*args, **kwargs): # 聚合
在目标函数之前
ret = fn(*arg, **kwargs) # 打散
在目标函数之后
return ret
return inner
return wrapper
@wrapper_out(实参) # 执行的时候. 先执行函数的调用然后使用返回值和前面的@组合成装饰器语法糖
def func():
pass
def play(a,b) :
print("登陆",a,b)
print("我卢本伟没有开挂")
print("我29杀吃鸡")
print("我无中生友秀的一批")
return "卢本伟果然牛逼"
def wrapper_out(kan):
def wrapper(fn):
def inner(*args,**kwargs) :
if kan != "仓鼠捶我" :
print("我先打开外挂")
print("打开直播")
ret = fn(*args,**kwargs)
print("关闭外挂")
return ret
else :
ret = fn(*args, **kwargs)
return ret
return inner
return wrapper
play = wrapper_out("仓鼠捶我")(play)
print(play("UU","PDD")) #执行函数,并打印返回的值
浙公网安备 33010602011771号