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

Python函数-函数装饰器的应用

发布时间:2023-12-04 01:17:35

函数装饰器是Python中一种非常重要的概念,它可以用于扩展现有函数的功能,而不需要修改原始函数的代码。在本文中,我们将介绍函数装饰器的概念以及它在Python中的应用。

函数装饰器是一个可以接受一个函数作为参数,并返回一个新函数的函数。它通常使用@符号来声明,并放置在被装饰函数的定义之上。例如:

@decorator
def my_function():
    pass

上面的代码等效于下面的代码:

def my_function():
    pass
    
my_function = decorator(my_function)

可以看出,函数装饰器的作用就是将被装饰的函数作为参数传递给装饰器函数,并将返回值重新赋值给原始函数。这样,当我们调用被装饰的函数时,实际上是调用了装饰器函数返回的新函数。

函数装饰器的应用非常广泛,下面我们介绍几个常见的应用场景。

1. 记录日志

函数装饰器可以用来记录函数的调用日志。我们可以在装饰器函数内部添加一些日志记录的代码,并在每次函数调用前后输出相关的日志信息。例如:

def log_decorator(func):
    def wrapper(*args, **kwargs):
        print(f"Calling function {func.__name__}")
        result = func(*args, **kwargs)
        print(f"Function {func.__name__} finished")
        return result
    return wrapper

@log_decorator
def add(x, y):
    return x+y

print(add(5, 3))

输出结果:

Calling function add
Function add finished
8

可以看到,函数add被装饰器log_decorator装饰后,在函数调用前后分别输出了相关的日志信息。

2. 计时器

函数装饰器还可以用来计算函数的执行时间。我们可以在装饰器函数内部添加一些计时的代码,并在函数调用前后记录时间差。例如:

import time

def timer_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Function {func.__name__} took {end_time - start_time}s to run")
        return result
    return wrapper

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

print(fibonacci(10))

输出结果:

Function fibonacci took 7.883787155151367s to run
55

可以看到,函数fibonacci被装饰器timer_decorator装饰后,在函数调用前后分别计算了时间差,并输出了函数的执行时间。

3. 输入验证

函数装饰器还可以用来验证函数的输入参数。我们可以在装饰器函数内部添加一些验证的代码,并在函数调用前检查参数的合法性。例如:

def input_validator(func):
    def wrapper(*args, **kwargs):
        if any([arg < 0 for arg in args]):
            raise ValueError("Input arguments must be non-negative")
        return func(*args, **kwargs)
    return wrapper

@input_validator
def multiply(x, y):
    return x * y

print(multiply(5, 3))
print(multiply(-5, 3))

输出结果:

15
Traceback (most recent call last):
  File "<stdin>", line 12, in <module>
  File "<stdin>", line 5, in wrapper
ValueError: Input arguments must be non-negative

可以看到,函数multiply被装饰器input_validator装饰后,在函数调用前检查了参数的合法性,如果有任何一个参数小于0,就会抛出ValueError异常。

总结:

本文介绍了Python中函数装饰器的概念以及它的应用场景。函数装饰器可以用来扩展函数的功能,例如记录日志、计时器和输入验证等。函数装饰器是Python中非常重要的概念,掌握它可以让我们写出更加灵活、可复用的代码。希望本文能对你理解函数装饰器有所帮助。