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

Python中的装饰器函数及其用法

发布时间:2023-12-03 08:53:21

装饰器是Python语言中一种特殊的函数,用于修改其他函数的功能。装饰器本身接受一个函数作为参数,并返回一个新的函数。装饰器可以用来在不修改原函数的情况下给函数添加额外的功能,比如日志记录、性能分析、输入检查等。

装饰器的语法使用@符号,可以直接放在函数定义的上方。下面是一个简单的装饰器的例子:

def decorator_function(original_function):
    def wrapper_function(*args, **kwargs):
        # 添加额外的功能
        print("装饰器添加的功能")
        # 调用原函数
        result = original_function(*args, **kwargs)
        # 添加额外的功能
        print("装饰器添加的功能")
        # 返回结果
        return result
    return wrapper_function

@decorator_function
def my_function():
    print("原函数")

上述例子中,decorator_function是一个装饰器函数,它接受一个原函数original_function作为参数,返回一个新的函数wrapper_functionwrapper_function在调用原函数前后可以添加额外的功能,比如输出一些信息,并最终返回原函数的结果。

使用装饰器时,可以在原函数的定义上方使用@decorator_function语法将装饰器应用到原函数上。这样,每次调用原函数时,都会先执行装饰器函数中的额外功能。

装饰器可以用于修改函数的行为,实现例如缓存、重试、异常处理、权限检查等功能。下面是一个使用装饰器实现缓存的例子:

import functools

def cache_decorator(original_function):
    # 使用functools库的wraps装饰器保留原函数的元信息
    @functools.wraps(original_function)
    def wrapper_function(*args, **kwargs):
        cache_key = str(args) + str(sorted(kwargs.items()))
        if cache_key in wrapper_function.cache:
            # 如果结果已经缓存,则直接返回缓存结果
            return wrapper_function.cache[cache_key]
        else:
            # 否则调用原函数并缓存结果
            result = original_function(*args, **kwargs)
            wrapper_function.cache[cache_key] = result
            return result
    # 准备一个字典作为缓存
    wrapper_function.cache = {}
    return wrapper_function

@cache_decorator
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

这个例子中,我们定义了一个装饰器函数cache_decorator,它用于给fibonacci函数添加缓存功能。装饰器函数内部定义了一个字典cache作为缓存。每次调用fibonacci函数时,会先根据参数生成一个唯一的缓存键cache_key。如果cache_key存在于缓存字典中,就直接返回缓存结果;否则,就调用原函数计算结果,并将结果缓存起来。

装饰器是Python中非常强大和灵活的特性,可以方便地修改函数的功能,提高代码的可重用性和可维护性。使用装饰器可以很容易地给函数添加额外的功能,而无需修改原函数的定义。