导读:本期聚焦于小伙伴创作的《多个装饰器叠加 @dec1 时执行顺序到底是怎样的》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《多个装饰器叠加 @dec1 时执行顺序到底是怎样的》有用,将其分享出去将是对创作者最好的鼓励。

在Python里使用多个装饰器修饰同一个函数时,装饰器的执行顺序有固定的规则,理解这个规则能帮助开发者正确设计装饰器的叠加逻辑。当代码中先写@dec1再写其他装饰器时,装饰器的加载和函数调用阶段的执行顺序存在差异,下面通过具体示例说明。

多个装饰器叠加 @dec1 时执行顺序到底是怎样的

装饰器的基础原理回顾

装饰器本质是高阶函数,它接收被修饰的函数作为参数,返回一个替代原函数的新函数。当我们使用@dec1修饰函数func时,等价于执行func = dec1(func)的操作。多个装饰器叠加时,这个替换过程会依次执行。

多个装饰器叠加的执行顺序

假设我们有两个装饰器dec1和dec2,按照如下方式修饰函数:

# 定义第一个装饰器
def dec1(func):
    def wrapper1(*args, **kwargs):
        print("进入dec1的wrapper")
        result = func(*args, **kwargs)
        print("离开dec1的wrapper")
        return result
    return wrapper1

# 定义第二个装饰器
def dec2(func):
    def wrapper2(*args, **kwargs):
        print("进入dec2的wrapper")
        result = func(*args, **kwargs)
        print("离开dec2的wrapper")
        return result
    return wrapper2

# 多个装饰器叠加修饰函数,先写@dec1,再写@dec2
@dec1
@dec2
def test_func():
    print("执行test_func主体逻辑")
    return "test_result"

# 调用被修饰后的函数
if __name__ == "__main__":
    res = test_func()
    print("函数返回值:", res)

运行上述代码后,输出结果如下:

进入dec1的wrapper
进入dec2的wrapper
执行test_func主体逻辑
离开dec2的wrapper
离开dec1的wrapper
函数返回值: test_result

加载阶段的顺序

多个装饰器叠加时,加载阶段(也就是函数定义的时候)的执行顺序是从下往上的。上面的代码中,@dec1写在@dec2的上方,实际加载时先执行test_func = dec2(test_func),再执行test_func = dec1(test_func)。最终得到的test_func其实是dec1返回的wrapper1函数,而wrapper1内部调用的func是dec2返回的wrapper2函数,wrapper2内部调用的func才是原始的test_func。

调用阶段的顺序

当调用被修饰后的test_func时,执行顺序是从上往下的。首先进入dec1的wrapper1,然后进入dec2的wrapper2,接着执行原始函数逻辑,之后先退出dec2的wrapper2,最后退出dec1的wrapper1,整体呈现类似嵌套的结构。

装饰器带参数的情况

如果装饰器本身带参数,执行顺序的规则依然一致,只是多了一层参数接收的逻辑。示例如下:

# 带参数的装饰器dec1
def dec1(param):
    def outer1(func):
        def wrapper1(*args, **kwargs):
            print(f"dec1参数:{param},进入dec1的wrapper")
            result = func(*args, **kwargs)
            print("离开dec1的wrapper")
            return result
        return wrapper1
    return outer1

# 带参数的装饰器dec2
def dec2(param):
    def outer2(func):
        def wrapper2(*args, **kwargs):
            print(f"dec2参数:{param},进入dec2的wrapper")
            result = func(*args, **kwargs)
            print("离开dec2的wrapper")
            return result
        return wrapper2
    return outer2

# 叠加使用带参数的装饰器
@dec1("dec1_param")
@dec2("dec2_param")
def test_func2():
    print("执行test_func2主体逻辑")

if __name__ == "__main__":
    test_func2()

上述代码的输出结果为:

dec1参数:dec1_param,进入dec1的wrapper
dec2参数:dec2_param,进入dec2的wrapper
执行test_func2主体逻辑
离开dec2的wrapper
离开dec1的wrapper

总结

多个装饰器叠加时,记住两个核心规则即可:加载阶段从下往上依次执行装饰器函数,调用阶段从上往下依次执行装饰器的内部包装逻辑。先写的@dec1会在加载阶段最后执行,在调用阶段最先执行。开发者可以根据这个规则合理设计多个装饰器的执行逻辑,满足不同的业务需求。

装饰器Python函数装饰闭包@dec1修改时间:2026-06-21 23:57:25

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。