装饰器进阶
使用装饰器修复技术wraps
from functools import wraps def wrapper(func): @wraps(func) def inner(*args, **kwargs): print("在被装饰函数之前要做的事") ret = func(*args, **kwargs) print("在被装饰函数之后要做的事") return ret return inner @wrapper def test(param): print(123) return param ret = test("ABC") print(ret) print(test.__name__) # 结果为test,如果不使用wraps,结果为inner
带参数的装饰器
from functools import wraps flag = False # 可以说是控制装饰器是否工作 def wrapper_out(flag): def wrapper(func): @wraps(func) def inner(*args, **kwargs): if flag: print("在被装饰函数之前要做的事") ret = func(*args, **kwargs) print("在被装饰函数之后要做的事") return ret else: return func(*args, **kwargs) return inner return wrapper @wrapper_out(flag) def test(param): print(123) return param ret = test("ABC") print(ret)
多个装饰器装饰一个函数
from functools import wraps def wrapper1(func): @wraps(func) def inner(*args, **kwargs): print("wrapper1:before") ret = func(*args, **kwargs) print("wrapper1:after") return ret return inner def wrapper2(func): @wraps(func) def inner(*args, **kwargs): print("wrapper2:before") ret = func(*args, **kwargs) print("wrapper2:after") return ret return inner @wrapper1 @wrapper2 def test1(param): print(123) return param print(test1("ABC"))