使用wraps()装饰器为函数添加自定义属性
发布时间:2024-01-10 00:43:08
wraps()是一个装饰器,它可以用于将被装饰函数的属性复制到装饰后的函数上。这个功能在编写装饰器时非常有用,因为它可以保留原始函数的元数据和文档字符串。通过@wraps装饰器,我们可以直接访问被装饰函数的属性,而不会被装饰函数覆盖。
下面是一个使用wraps()装饰器为函数添加自定义属性的例子:
from functools import wraps
def add_custom_property(custom_property):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
# 调用原始函数
result = func(*args, **kwargs)
# 为装饰函数添加属性
wrapper.custom_property = custom_property
return result
return wrapper
return decorator
@add_custom_property('Hello, World!')
def greeting():
print('Hello!')
# 访问自定义属性
print(greeting.custom_property)
在上面的例子中,我们定义了一个装饰器函数add_custom_property(),它接受一个自定义属性作为参数。这个装饰器返回一个内部的decorator函数,该函数使用wraps()装饰器来确保原始函数的属性被正确复制。
在装饰器内部的wrapper函数中,我们首先调用了原始函数func(*args, **kwargs),并将返回值保存在result变量中。然后,我们通过wrapper.custom_property = custom_property将自定义属性添加到装饰后的函数上。
最后,我们使用@add_custom_property('Hello, World!')装饰器将greeting()函数装饰起来。当我们打印greeting函数的custom_property属性时,它将输出'Hello, World!'。
通过使用wraps()装饰器,我们可以方便地为函数添加自定义属性,而不会影响被装饰函数的行为和属性。这对于扩展函数的功能并保留原始函数的元数据非常有用。
