python(十一):装饰器

it2023-01-07  67

1. 定义

装饰器:返回一个函数的高阶函数

2. 理解

编写最简单通用装饰器函数

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()

3. 问题

如果我们注释掉 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")

 

4. 参考链接

https://www.runoob.com/w3cnote/python-func-decorators.html

最新回复(0)