Python装饰器是一种高级Python语法,它允许我们在不修改原有函数代码的情况下,为函数增加新的功能。装饰器本质上是一个接受函数作为参数并返回一个新函数的高阶函数。这种机制在很多场景下非常有用,比如日志记录、性能测试、权限校验等。
1. 装饰器的基础
让我们从一个简单例子开始,定义一个装饰器来为函数添加日志记录功能:
def log_decorator(func):
def wrapper(*args, **kwargs):
print(f"Calling function: {func.__name__}")
result = func(*args, **kwargs)
print(f"{func.__name__} executed successfully")
return result
return wrapper
@log_decorator
def add(a, b):
return a + b
在这个例子中,log_decorator
是一个装饰器,它接收一个函数func
作为参数,并返回一个新的函数wrapper
。当我们使用@log_decorator
修饰add
函数时,每次调用add
实际上都会先执行wrapper
函数中的内容。
2. 带参数的装饰器
有时候,我们需要为装饰器传递一些参数,以便更加灵活地控制装饰的行为。这时,我们可以使用“装饰器工厂”的概念:
def log_with_level(level):
def decorator(func):
def wrapper(*args, **kwargs):
print(f"[{level}] Calling function: {func.__name__}")
result = func(*args, **kwargs)
print(f"[{level}] {func.__name__} executed successfully")
return result
return wrapper
return decorator
@log_with_level("DEBUG")
def multiply(x, y):
return x * y
这里,log_with_level
是一个装饰器工厂,它接收一个参数level
,然后返回一个装饰器。这样我们就可以为不同的函数指定不同级别的日志记录。
3. 装饰器的高级应用
装饰器还可以用于很多高级场景,比如实现单例模式、缓存结果、路由分发等。例如,我们可以使用装饰器来实现一个简单的缓存机制:
def cache(func):
cache_data = {
}
def wrapper(*args):
if args in cache_data:
print("Fetching from cache")
return cache_data[args]
else:
result = func(*args)
cache_data[args] = result
return result
return wrapper
@cache
def fibonacci(n):
if n < 2:
return n
return fibonacci(n-1) + fibonacci(n-2)
在这个例子中,我们定义了一个cache
装饰器,用于缓存斐波那契数列的计算结果。当函数被多次调用时,可以直接从缓存中获取结果,避免了重复计算。
通过这些例子,我们可以看到装饰器的强大之处。它们不仅能够让我们的代码更加简洁,还能够提高代码的可重用性和可维护性。掌握装饰器的使用,对于任何希望提升其Python编程技能的人来说都是一项宝贵的技能。