Python 中多个装饰器的执行顺序是什么?

推荐答案

在 Python 中,多个装饰器的执行顺序是从下往上,即从最靠近函数的装饰器开始执行,然后依次向外执行。具体来说,装饰器的执行顺序遵循“装饰器堆叠”的规则,即最内层的装饰器最先执行,最外层的装饰器最后执行。

例如:

在这个例子中,装饰器的执行顺序是 decorator3 -> decorator2 -> decorator1

本题详细解读

装饰器的基本概念

装饰器是 Python 中一种用于修改或扩展函数或方法行为的语法结构。它本质上是一个接受函数作为参数并返回一个新函数的可调用对象。装饰器通常用于在不修改原始函数代码的情况下,添加额外的功能,如日志记录、权限检查、性能测试等。

多个装饰器的执行顺序

当多个装饰器应用于同一个函数时,Python 会按照从下往上的顺序依次应用这些装饰器。具体来说,Python 会先应用最内层的装饰器,然后依次向外应用外层的装饰器。

示例代码

-- -------------------- ---- -------
--- -----------------
    --- ----------
        ---------------- - --------
        ------
        ---------------- - -------
    ------ -------

--- -----------------
    --- ----------
        ---------------- - --------
        ------
        ---------------- - -------
    ------ -------

--- -----------------
    --- ----------
        ---------------- - --------
        ------
        ---------------- - -------
    ------ -------

-----------
-----------
-----------
--- --------------
    ------------- -------------

-------------

输出结果

执行顺序解析

  1. decorator3 最先执行:因为 decorator3 是最靠近 my_function 的装饰器,所以它最先被应用。decorator3wrapper 函数会先执行,打印出 "Decorator 3 before",然后调用原始函数 my_function

  2. decorator2 其次执行decorator2wrapper 函数会包裹 decorator3wrapper 函数。因此,decorator2wrapper 会在 decorator3wrapper 之前执行,打印出 "Decorator 2 before"。

  3. decorator1 最后执行decorator1wrapper 函数会包裹 decorator2wrapper 函数。因此,decorator1wrapper 会在 decorator2wrapper 之前执行,打印出 "Decorator 1 before"。

  4. 函数执行:当所有装饰器的 wrapper 函数都执行完毕后,原始函数 my_function 才会被调用,打印出 "Inside my_function"。

  5. 装饰器的后置操作:在 my_function 执行完毕后,装饰器的 wrapper 函数会依次执行后置操作,打印出 "Decorator 3 after"、"Decorator 2 after" 和 "Decorator 1 after"。

总结

多个装饰器的执行顺序是从下往上,即从最靠近函数的装饰器开始执行,然后依次向外执行。理解这一点对于正确使用装饰器非常重要,尤其是在需要多个装饰器协同工作时。

纠错
反馈