07装饰器执行的顺序是怎样的(先执行装饰器还是原函数)?
文章目录
问题: 装饰器执行的顺序是怎样的(先执行装饰器还是原函数)?
👇 点击展开/折叠 面试背诵模板(建议先背这个)
代码示例:装饰阶段顺序
1 | def deco1(func): |
执行顺序速览
| 阶段 | 顺序 | 说明 |
|---|---|---|
| 装饰阶段(定义时) | 从下往上(靠近函数的先执行) | 等价于 target = deco1(deco2(target)) |
| 调用阶段(执行时) | 从上往下(最外层先执行) | 先执行最外层装饰器的包装逻辑,逐层向内执行 |
本质解释
1 |
|
实战对比:多个装饰器叠加时的注意事项
| 装饰器组合 | 定义时执行顺序 | 调用时执行顺序 |
|---|---|---|
@timer @logger def f(): |
logger 先执行,timer 后执行 | timer 的 wrapper 先执行,logger 的 wrapper 后执行 |
| 装饰器 a 在最外层,b 在最内层 | b 先执行,a 后执行 | a 的 wrapper 先执行,b 的 wrapper 后执行 |
1 | from functools import wraps |
容易混淆的要点(面试高频)
- 装饰器本身在定义时执行,不是在调用时执行。
- 多个装饰器叠加:定义时从内向外(从下往上),调用时从外向内(从上往下)。
- **
@deco1 @deco2不等价于@deco2 @deco1**,顺序交换会改变执行逻辑。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 LGQ的博客!