函数的装饰器.
1. 装饰器
开闭原则:
对功能的扩展开放
对代码的修改是封闭
通用装饰器语法:
代码语言:javascript复制def wrapper(fn):
def inner(*args, **kwargs): # 聚合
"""在目标函数之前的内容"""
ret = fn(*arg, **kwargs) # 打散
"""在目标函数之后的内容"""
return ret
return inner
@wrapper
def func():
pass
func()
2. 同一个函数被多个装饰器装饰
就近原则
代码语言:javascript复制def wrapper1(fn):
def inner(*args, **kwargs):
print("1")
ret = fn(*args, **kwargs)
print("2")
return ret
return inner
def wrapper2(fn):
def inner(*args, **kwargs):
print("3")
ret = fn(*args, **kwargs)
print("4")
return ret
return inner
def wrapper3(fn):
def inner(*args, **kwargs):
print("5")
ret = fn(*args, **kwargs)
print("6")
return ret
return inner
# 顺序 1 2 3 func 3 2 1
@wrapper1
@wrapper2
@wrapper3
def func():
print("我是谁,我在哪")
func() # 1 3 5 我是谁,我在哪 6 4 2
3. 带参数的装饰器
代码语言:javascript复制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