Python函数-函数装饰器的应用
函数装饰器是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中非常重要的概念,掌握它可以让我们写出更加灵活、可复用的代码。希望本文能对你理解函数装饰器有所帮助。
