在Python装饰器带参数的学习过程中,很多初学者常常感到困惑。其实,只要理解了装饰器的本质,再加上一点耐心,你也能轻松掌握这项强大的Python高级语法技巧。
装饰器(Decorator)是 Python 中一种用于修改或增强函数行为的语法结构。它本质上是一个接受函数作为参数并返回新函数的高阶函数。
普通的装饰器功能固定,无法动态调整行为。而带参装饰器允许我们在使用时传入配置参数,使装饰逻辑更加灵活。例如:控制日志级别、设置重试次数、指定缓存时间等。
要实现一个带参数的装饰器,我们需要三层嵌套函数:
def repeat(times): def decorator(func): def wrapper(*args, **kwargs): for _ in range(times): result = func(*args, **kwargs) return result return wrapper return decorator# 使用装饰器@repeat(3)def say_hello(): print("Hello!")say_hello()# 输出:# Hello!# Hello!# Hello! 在这个例子中,repeat 是一个带参数的装饰器工厂函数。调用 @repeat(3) 时,首先执行 repeat(3) 返回真正的装饰器 decorator,然后用这个装饰器去包装 say_hello 函数。
import functoolsimport timedef log_execution(level="INFO", prefix="[LOG]"): def decorator(func): @functools.wraps(func) # 保留原函数元信息 def wrapper(*args, **kwargs): start = time.time() print(f"{prefix} {level}: Calling {func.__name__}") result = func(*args, **kwargs) end = time.time() print(f"{prefix} {level}: {func.__name__} finished in {end - start:.4f}s") return result return wrapper return decorator@log_execution(level="DEBUG", prefix="[MYAPP]")def calculate_sum(n): return sum(range(n))result = calculate_sum(1000000)# 输出类似:# [MYAPP] DEBUG: Calling calculate_sum# [MYAPP] DEBUG: calculate_sum finished in 0.0421s 注意这里使用了 @functools.wraps(func),这是为了保留被装饰函数的原始名称、文档字符串等元信息,避免调试时出现混淆。
functools.wraps 保持函数元数据通过本文,我们详细讲解了Python装饰器带参数的实现原理和使用方法。这种函数装饰器技术是 Python 高级编程的重要组成部分,能极大提升代码的可读性和复用性。掌握它,你就能写出更优雅、更灵活的 Python 程序!
关键词回顾:Python装饰器带参数、带参装饰器、Python高级语法、函数装饰器
本文由主机测评网于2025-12-22发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/20251211437.html