装饰器:返回一个函数的高阶函数
编写最简单通用装饰器函数
def a_new_decorator(a_func): def warpper(): print("do it before excute a_func") a_func() print("done after excute") return warpper @a_new_decorator def b_func_req_decorator(): print("funcB need decorator, excuted")其输出如下所示
为了方便理解,装饰器与以下代码所执行功能是一样的,将 a_func_req_decorator 函数作为一个参数出入到 a_nwe_decorator 函数中,然后再调用 a_func_req_decorator 函数执行。 @a_new_decorator 的作用就是将这个调用简化
a_func_req_decorator = a_new_decorator(a_func_req_decorator) a_func_req_decorator()如果我们注释掉 a_new_decorator 中的返回函数,如下代码所示
def a_new_decorator(a_func): def warpper(): print("do it before excute a_func") a_func() print("done after excute") # return warpper执行代码,报错信息如下:
再看下面两行代码,它的作用就是装饰器的作用,如果删除 return wapper 这个代码,表示函数 a_new_decorator 将不会返回任何值,它返回值是 None.
a_func_req_decorator = a_new_decorator(a_func_req_decorator) a_func_req_decorator()如果保留 return wapper 打印将得到如下结果,表示它是一个装饰器。
如果我们打印 a_func_req_decorator 的属性,得到如下结果:
print(a_func_req_decorator.__name__)这个Wrapper是我们之前定义的包装函数
def a_new_decorator(a_func): def warpper(): print("do it before excute a_func") a_func() print("done after excute") return warpper这个结果表示,我们的函数 a_func_req_decorator 的属性名称被篡改了,我们需要 python 提供的一个库来解决这个问题,所以最终完整代码如下:
from functools import wraps def a_new_decorator(a_func): @wraps(a_func) def warpper(): print("do it before excute a_func") a_func() print("done after excute") return warpper def a_func_req_decorator(): print("Function need decorator") @a_new_decorator def b_func_req_decorator(): print("funcB need decorator, excuted")
https://www.runoob.com/w3cnote/python-func-decorators.html