在理解 装饰器 的观点之前,先理解一下 Python 中装饰器 的强大功能。
Decorators 许可根据须要修正功能,而无需永久修正它。更大略地说,装饰器许可在调用函数之前和之后进行修正。为了学习装饰器,必须理解以下两个观点。
1. 函数是工具,它们可以分配给变量并通报给其他函数并从其他函数返回。2. 函数可以在其他函数中定义,子函数可以捕获父函数的局部状态(闭包)。
基本上,装饰器将可调用工具作为参数,进行一些修正并返回另一个可调用工具。
(图片来自网络侵删)Callable 是实现分外方法 __call__() 的任何工具
具有双下划线的方法(如 __call__())也称为 dunders。
现在实现装饰器。下面,函数 mul 是一个普通函数,它返回两个数的乘法。def mul(a,b):
def mul(a,b): return abprint(mul(10,10))
让在装饰器的帮助下进行一些变动。def decorate (func):def decorate (func): def wrapper(a,b): print('----') ans=func(a,b) print(ans) print('----') return wrapper@decoratedef mul(a,b): return abprint (mul(10,20))
在上面的示例中,函数“decorate”是一个装饰器。它接管 func 函数作为参数。每个装饰器都该当具有包装器功能。可以给包装函数起任何名字。在上面的例子中,“wrapper”是包装器函数。在包装器函数中,进行所有修正。正如在上面的例子中看到的,在调用我们的函数之前和之后只添加了两个 print() 语句。
要将装饰器运用于函数,必须利用 @ decorator_name。可以在上面程序的第 10 行中看到这一点。@符号只是一个句法糖。实际上,调用装饰器如下:
decorateor(mul(a, b))
现在让看看输出:
敏锐的不雅观察者一定已经把稳到,装饰器内部的包装函数参数与它装饰的函数参数相同。为了战胜这个限定,使装饰器更通用,可以处理任意数量的参数,可以利用 ,
functior(args, kwargs)
关键要点:
1. 装饰器接管函数作为参数并返回另一个函数。
2.装饰器必须具有包装功能,并应返回。
3.修正应在包装器功能内部进行。
4. 要将装饰器运用于函数,请在定义函数之前将 @ 与装饰器的名称一起利用。