You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何装饰器在函数装饰阶段触发而非调用时?代码更新时机疑问

装饰器执行时机问题解答

问题1:为什么装饰器会在函数被装饰时触发,而非调用被装饰后的函数时触发?

Python的装饰器@语法是语法糖,本质等价于:

被装饰函数 = 装饰器(被装饰函数)

这行代码会在**函数定义阶段(模块加载、代码执行到函数定义语句时)**直接执行,不是等你调用被装饰后的函数才运行。所以装饰器函数本身会在装饰目标函数的瞬间就触发执行,而非函数调用阶段。

问题2:在代码中,为什么每次装饰函数(例如装饰api4函数)时ls1都会被更新,而不是在调用该函数时才更新?

你贴的代码里,ls1.append((datetime.today(), f.__name__))是直接写在装饰器register_usage的顶层逻辑中的。当用@register_usage装饰api4时,Python会立刻执行register_usage(api4),这行append语句会直接运行,自然就更新了ls1。

如果要实现调用函数时才更新ls1,需要把append逻辑放到装饰器返回的包装函数里,修改后的代码如下:

import datetime
ls1=[]

def register_usage(f):
    def wrapper():
        ls1.append((datetime.today(), f.__name__))
        return f()
    return wrapper

@register_usage
def api4():
    return 'api4'

这样只有调用api4()时,才会触发wrapper函数里的append操作,进而更新ls1。


内容的提问来源于stack exchange,提问作者Vaggelis Ntaloukas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.10 00:28:12