简述什么是Python带参数的装饰器?
在Python中,带参数的装饰器是指装饰器函数本身可以接受额外的参数,这些参数在装饰器被应用到目标函数时可以指定。这种机制提供了更大的灵活性,允许我们在不同的上下文中重用同一个装饰器,但是以不同的配置方式。
带参数的装饰器通常涉及到三层嵌套:
- 最外层是接受参数的装饰器函数。
- 中间层是一个闭包,它返回实际的装饰器。
- 最内层是包装目标函数的闭包,它通常负责在调用目标函数前后执行额外的逻辑。
下面是一个带参数的装饰器示例,它接受一个参数prefix
,用于在目标函数被调用之前打印带有前缀的消息:
def log_with_prefix(prefix):
def actual_decorator(func):
def wrapper(*args, **kwargs):
print(f"{prefix}: Calling function {func.__name__}")
return func(*args, **kwargs)
return wrapper
return actual_decorator
# 使用带参数的装饰器
@log_with_prefix("DEBUG")
def add(x, y):
return x + y
# 调用函数
result = add(2, 3)
# 输出: DEBUG: Calling function add
在这个例子中,log_with_prefix
是最外层的函数,它接受一个参数prefix
。actual_decorator
是中间层的闭包,它返回了wrapper
函数,这个函数包装了目标函数add
。当add
函数被调用时,wrapper
会首先执行,打印带有前缀的消息,然后调用原始的add
函数并返回其结果。
通过使用@log_with_prefix("DEBUG")
语法,我们为add
函数应用了一个带参数的装饰器,并指定了参数值为"DEBUG"
。这样,我们就可以轻松地重用log_with_prefix
装饰器,但是为不同的函数或不同的调用上下文提供不同的前缀。