在函数上添加装饰器
程序员文章站
2022-06-01 20:20:28
...
想在已经存在的函数上添加一个装饰器,增加额外的操作处理(比如权限,日志、计时等)。
例如:
import time
from functools import wraps
def Count_Time(func):
"""
:param func:
:return:
"""
@wraps(func)
def wrapper(*args, **kwargs):
start = time.time()
result = func(*args, **kwargs)
end = time.time()
print(func.__name__, end - start)
return result
return wrapper
@Count_Time
def countdown(n):
'''
Counts down
'''
while n > 0:
n -= 1
if __name__ == "__main__":
countdown(100000)
countdown(10000000)
一个装饰器就是一个函数,它接受一个函数作为参数并返回一个新的函数, 内置的装饰器比如 @staticmethod, @classmethod,@property 原理也是一样的。
wrapper() 函数中, 装饰器内部定义了一个使用 *args 和 **kwargs 来接受任意参数的函数。 在这个函数里面调用了原始函数并将其结果返回,然后这个新的函数包装器被作为结果返回来代替原始函数。
装饰器并不会修改原始函数的参数签名以及返回值。 使用 *args 和 **kwargs 目的就是确保任何参数都能适用。 而返回结果值基本都是调用原始函数 func(*args, **kwargs) 的返回结果,其中func就是原始函数。
- 使用 @wraps(func) 注解是很重要的, 它能保留原始函数的元数据。
上一篇: 闭包 和 装饰器
下一篇: PythonDay4---装饰器