装饰器(Decorator)是 Python 中一种强大的工具,它允许我们在不修改源代码的情况下扩展或修改函数、类等对象的行为。装饰器本质上是一个接收一个函数作为参数并返回一个新的函数的高阶函数。
功能:
- 可重用性:装饰器提供了在多个函数上应用相同行为的一种方式,比如添加日志、性能分析、权限控制等。
- 模块化:通过将装饰器定义为独立的函数或类,可以将相关的功能封装在一起,提高代码的组织性和可读性。
- 无侵入性:装饰器不会改变原始函数的名称和元信息,对调用者来说透明。
用法:
装饰器的语法糖使得使用它们变得非常直观和简洁。以下是装饰器的基本用法:
# 定义一个简单的装饰器
def simple_decorator(func):
def wrapper(*args, **kwargs):
print("Before function call")
result = func(*args, **kwargs)
print("After function call")
return result
return wrapper
# 使用装饰器来包装函数
@simple_decorator
def my_function():
print("Function body")
# 调用函数
my_function()
在这个例子中,simple_decorator
是一个装饰器函数,它接收一个函数 func
作为参数,并返回一个新的函数 wrapper
。当我们在 my_function
上使用 @simple_decorator
装饰器时,实际上是用 wrapper
函数替换了原来的 my_function
。因此,当我们调用 my_function()
时,实际上执行的是 wrapper()
,这会导致在调用前后打印出相应的消息。
除了这个基本的用法,装饰器还可以接受参数,以便提供更灵活的功能。例如,下面是一个带有参数的装饰器示例:
from functools import wraps
def logged(level, message=""):
def decorator(func):
@wraps(func)
def wrapper(*args, **kwargs):
print(f"{level}: {message} - Before function call")
result = func(*args, **kwargs)
print(f"{level}: {message} - After function call")
return result
return wrapper
return decorator
@logged("INFO", "Performing calculation")
def calculate(x, y):
return x + y
result = calculate(3, 4)
print(result) # 输出:
# INFO: Performing calculation - Before function call
# 7
# INFO: Performing calculation - After function call
在这个例子中,logged
装饰器接受两个参数 level
和 message
,并在装饰函数时传入这些值。这样,我们可以在不同的地方使用同一个装饰器,但可以根据需要定制其行为。