使用装饰器修复技术wraps
from functools import wrapsdef wrapper(func): @wraps(func) def inner(*args, **kwargs): print("在被装饰函数之前要做的事") ret = func(*args, **kwargs) print("在被装饰函数之后要做的事") return ret return inner@wrapperdef test(param): print(123) return paramret = test("ABC")print(ret)print(test.__name__) # 结果为test,如果不使用wraps,结果为inner
带参数的装饰器
from functools import wrapsflag = 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 paramret = test("ABC")print(ret)
多个装饰器装饰一个函数
from functools import wrapsdef wrapper1(func): @wraps(func) def inner(*args, **kwargs): print("wrapper1:before") ret = func(*args, **kwargs) print("wrapper1:after") return ret return innerdef wrapper2(func): @wraps(func) def inner(*args, **kwargs): print("wrapper2:before") ret = func(*args, **kwargs) print("wrapper2:after") return ret return inner@wrapper1@wrapper2def test1(param): print(123) return paramprint(test1("ABC"))