在 Python 中,装饰器(Decorator)是一种特殊的语法功能,它可以用来修改、扩展或包装函数或类的行为。装饰器本质上是一个函数,它接受另一个函数或类作为输入,并返回一个新的函数或类。装饰器在函数和类的定义之前使用 @ 符号来应用。
装饰器的主要作用有:
-
添加额外功能:装饰器可以在不修改原始函数或类的情况下,为其添加额外的功能。例如,可以用装饰器来添加日志记录、性能监测、缓存等功能。
-
分离关注点:装饰器可以将不同关注点的代码分离开来,使得代码更加模块化和易于维护。原始函数或类只关注核心功能,而其他功能通过装饰器进行添加。
-
代码复用:装饰器可以用于多个函数或类,从而实现代码的复用。当多个函数或类需要相同的功能时,可以使用相同的装饰器来添加这些功能,避免重复编写代码。
-
AOP(面向切面编程):装饰器是 AOP 的一种实现方式,它可以在不改变原有代码的情况下,将与核心功能无关的横切逻辑(例如日志记录、权限验证等)独立出来,从而提高代码的可维护性和可重用性。
-
实现缓存:装饰器可以用于实现缓存功能,将函数的计算结果缓存起来,避免重复计算,提高程序的执行效率。
-
修改行为:装饰器可以修改函数或类的行为,使其符合特定需求。例如,可以用装饰器来进行输入验证、异常处理等。
日志记录装饰器:
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling function {func.__name__} with arguments {args} and keyword arguments {kwargs}")
result = func(*args, **kwargs)
print(f"Function {func.__name__} returned {result}")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
add_result = add(2, 3)
输出结果:
Calling function add with arguments (2, 3) and keyword arguments {}
Function add returned 5
缓存装饰器:
未使用缓存装饰器的时间消耗:
import time
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
start_time = time.time()
result = fibonacci(35)
end_time = time.time()
print(f"Fibonacci(35) = {result}")
print(f"Time taken without cache decorator: {end_time - start_time:.5f} seconds")
输出
Fibonacci(35) = 9227465
Time taken without cache decorator: 8.12685 seconds
使用了缓存装饰器:
import time
def cache_decorator(func):
cache = {}
def wrapper(*args):
if args in cache:
return cache[args]
else:
result = func(*args)
cache[args] = result
return result
return wrapper
@cache_decorator
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) + fibonacci(n - 2)
start_time = time.time()
result = fibonacci(35)
end_time = time.time()
print(f"Fibonacci(35) = {result}")
print(f"Time taken with cache decorator: {end_time - start_time:.5f} seconds")
输出
Fibonacci(35) = 9227465
Time taken with cache decorator: 0.01433 seconds