在Python装饰器嵌套的世界里,多个装饰器可以像“俄罗斯套娃”一样层层包裹函数,实现功能的叠加与组合。对于初学者来说,这可能看起来有些复杂,但只要理解了基本原理,就能轻松驾驭这一强大特性。本文将带你一步步掌握Python装饰器教程中的核心——装饰器的嵌套使用。

装饰器(Decorator)是Python中一种用于修改或增强函数行为的语法糖。它本质上是一个接受函数作为参数并返回新函数的高阶函数。
例如:
def my_decorator(func): def wrapper(): print("函数执行前...") func() print("函数执行后...") return wrapper@my_decoratordef say_hello(): print("Hello!")say_hello()运行结果:
函数执行前...Hello!函数执行后...当一个函数被多个装饰器修饰时,就形成了装饰器链式调用。Python会从最靠近函数的装饰器开始,逐层向外应用。
来看一个例子:
def bold(func): def wrapper(): return f"<b>{func()}</b>" return wrapperdef italic(func): def wrapper(): return f"<i>{func()}</i>" return wrapper@bold@italicdef greet(): return "你好,世界!"print(greet())输出结果:
<b><i>你好,世界!</i></b>注意:虽然我们先写了 @bold,再写 @italic,但实际上 @italic 先作用于 greet 函数,然后 @bold 再作用于 italic(greet) 的结果。也就是说,装饰器是从下往上应用的。
上面的装饰器嵌套等价于以下写法:
greet = bold(italic(greet))这有助于理解装饰器的执行顺序。
实际开发中,我们常使用带参数的装饰器。嵌套时需要注意每一层的参数传递。
from functools import wrapsimport timedef repeat(times): def decorator(func): @wraps(func) def wrapper(*args, **kwargs): for _ in range(times): result = func(*args, **kwargs) return result return wrapper return decoratordef log_time(func): @wraps(func) def wrapper(*args, **kwargs): start = time.time() result = func(*args, **kwargs) end = time.time() print(f"{func.__name__} 执行耗时: {end - start:.4f} 秒") return result return wrapper@repeat(3)@log_timedef calculate(x, y): time.sleep(0.1) # 模拟耗时操作 return x + yresult = calculate(2, 3)print("最终结果:", result)在这个例子中,@log_time 先包装 calculate,然后 @repeat(3) 再包装整个结果。因此,每次重复调用都会记录时间。
@functools.wraps:保留原函数的元信息(如 __name__、__doc__),避免调试困难。通过本教程,你已经掌握了Python高级装饰器中的嵌套使用方法。无论是简单的格式包装,还是复杂的日志+重试组合,装饰器嵌套都能让你的代码更加优雅和模块化。
记住关键点:装饰器从下往上应用,等价于函数的连续调用;合理使用 wraps;控制嵌套深度。现在,你可以自信地在项目中使用Python装饰器嵌套来提升代码质量了!
本文由主机测评网于2025-12-17发表在主机测评网_免费VPS_免费云服务器_免费独立服务器,如有疑问,请联系我们。
本文链接:https://www.vpshk.cn/2025129016.html