Python中扩展函数功能的装饰器
装饰器是Python中的一个强大的功能,它允许我们在不改变已有代码的情况下,为其添加一些额外的功能。扩展函数功能的装饰器不仅可以使代码更加优雅和易于阅读,还可以增强其可复用性和可扩展性。
装饰器的基本原理是将一个函数作为参数传入另一个函数,并返回一个函数。这个返回的函数可以包含原始函数的功能,也可以添加一些额外的功能。
下面是一个简单的例子,展示如何实现一个简单的装饰器:
def my_decorator(func):
def wrapper():
print("Before function is called.")
func()
print("After function is called.")
return wrapper
@my_decorator
def my_function():
print("Function is called.")
my_function()
输出结果为:
Before function is called. Function is called. After function is called.
在上述示例中,my_decorator是一个装饰器函数,它接受一个函数作为参数,并返回一个嵌套函数wrapper。在wrapper中添加了一些额外的功能,以增强原始函数的功能。@my_decorator是一个装饰器语法糖,用于将装饰器应用于my_function函数。
扩展函数功能的装饰器可以用于添加缓存,验证输入,计时等额外的功能。下面是一些例子:
1. 计时器装饰器
import time
def timer(func):
def wrapper(*args, **kwargs):
start_time = time.time()
result = func(*args, **kwargs)
end_time = time.time()
print(f"Time taken: {end_time - start_time:.6f}s")
return result
return wrapper
@timer
def my_function():
time.sleep(1)
my_function()
输出结果为:
Time taken: 1.000793s
在上述示例中,timer是一个计时器装饰器,它接受一个函数作为参数,并返回一个嵌套函数wrapper。在wrapper中添加了计时器的功能。
2. 缓存装饰器
def cache(func):
cached_results = {}
def wrapper(*args):
if args in cached_results:
return cached_results[args]
result = func(*args)
cached_results[args] = result
return result
return wrapper
@cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(10))
print(fibonacci(15))
print(fibonacci(10))
输出结果为:
55 610 55
在上述示例中,cache是一个缓存装饰器,它接受一个函数作为参数,并返回一个嵌套函数wrapper。在wrapper中添加了缓存的功能,以避免重复计算。
3. 验证装饰器
def validate_input(func):
def wrapper(*args, **kwargs):
for arg in args:
if not isinstance(arg, int):
raise TypeError(f"Argument {arg} is not an integer.")
for kwarg, value in kwargs.items():
if not isinstance(value, int):
raise TypeError(f"Argument {value} for {kwarg} is not an integer.")
return func(*args, **kwargs)
return wrapper
@validate_input
def add_numbers(a, b, c):
return a + b + c
print(add_numbers(1, 2, 3))
print(add_numbers(1, '2', c='3'))
输出结果为:
6
Traceback (most recent call last):
File "example.py", line 17, in <module>
print(add_numbers(1, '2', c='3'))
File "example.py", line 5, in wrapper
raise TypeError(f"Argument {arg} is not an integer.")
TypeError: Argument 2 is not an integer.
在上述示例中,validate_input是一个验证装饰器,它接受一个函数作为参数,并返回一个嵌套函数wrapper。在wrapper中添加了输入验证的功能,以确保输入的参数都是整数类型。
总结:
扩展函数功能的装饰器是Python中一个强大的特性,它允许我们在不改变已有代码的情况下,为其添加一些额外的功能,增强代码的可读性、可复用性和可扩展性。通过实例的介绍,我们可以看到装饰器可以用于添加计时器、缓存、验证输入等各种功能,使代码更加优雅和可靠。
