欢迎访问宙启技术站
智能推送

使用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()装饰器,我们可以方便地为函数添加自定义属性,而不会影响被装饰函数的行为和属性。这对于扩展函数的功能并保留原始函数的元数据非常有用。