上面不是标准的装饰器,装饰器肯定返回装饰器函数,不行在定义装饰器去执行业务,装饰器在“形成(定义)”阶段,只负责返回一个增强版的函数对象,绝对不应该执行原函数的业务代码;真正的业务代码和增强逻辑,必须推迟到“调用”阶段才执行。
为什么顺序是这样的?(由内向外)
很多人容易搞混装饰器的执行顺序,你的代码很好地展示了这一点:
1. 先执行 @funcA (最靠近函数的):
相当于 f = funcA(f) 。此时 f 变成了被 A 包装过的版本。
2. 再执行 @funcB (外层的):
相当于 f = funcB(上一步的结果) 。此时 f 变成了被 B 包装过的版本。
所以,离函数定义越近的装饰器,越先被执行(越在里层)。