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

Python装饰器:为函数添加额外功能和属性

发布时间:2023-07-04 02:53:11

Python装饰器是一种特殊的函数,用于在不修改原始函数代码的情况下为函数添加额外的功能和属性。装饰器的作用类似于AOP(面向方面编程),可以动态地修改一个函数或方法的行为。

装饰器的使用方式如下:

@decorator
def function():
    pass

装饰器可以理解为一个闭包函数,它接收一个函数作为参数,并返回一个新的函数。装饰器在内部定义了一个包装函数,用于包装原始函数。在包装函数中,可以添加额外的功能,然后再调用原始函数。最后,返回包装函数的引用。

装饰器可以实现以下功能:

1. 添加额外功能:可以在原始函数的前后添加额外的代码逻辑,例如日志记录、性能统计、异常处理等。

def logger(func):
    def wrapper(*args, **kwargs):
        print(f'Calling function {func.__name__}')
        result = func(*args, **kwargs)
        print(f'Function {func.__name__} called')
        return result
    return wrapper

@logger
def add(a, b):
    return a + b

add(1, 2)  # Output: Calling function add Function add called

2. 修改函数参数或返回值:可以用装饰器修改函数的参数或返回值,例如类型检查、数据转换等。

def convert_data_type(func):
    def wrapper(value):
        if isinstance(value, str):
            value = int(value)
        result = func(value)
        return result
    return wrapper

@convert_data_type
def square(n):
    return n * n

print(square("2"))  # Output: 4

3. 缓存函数结果:可以用装饰器缓存函数的结果,以提高函数执行效率。

def cache(func):
    memo = {}
    def wrapper(*args):
        if args in memo:
            return memo[args]
        else:
            result = func(*args)
            memo[args] = result
            return result
    return wrapper

@cache
def fibonacci(n):
    if n < 2:
        return n
    else:
        return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(10))  # Output: 55

4. 添加属性和方法:可以用装饰器在函数上添加额外的属性和方法。

def add_attribute(func):
    func.description = "This is a function."
    return func

@add_attribute
def my_function():
    pass

print(my_function.description)  # Output: This is a function.

总结而言,Python装饰器是一种非常强大的语法特性,可以在不修改原始函数代码的情况下为函数添加额外的功能和属性。通过装饰器,我们可以实现代码的复用和扩展,提高代码的可读性和可维护性。