函数装饰器
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")) #执行函数,并打印返回的值