python

关注公众号 jb51net

关闭
首页 > 脚本专栏 > python > Python装饰器装饰顺序和调用顺序

Python装饰器装饰顺序和调用顺序有什么区别?新手必看

作者:哆啦de梦

你是否对Python装饰器的执行顺序感到困惑?本文通过简单代码实例,清晰展示多个装饰器叠加时的运行逻辑,帮你彻底搞懂装饰器从外到内装饰、从内到外执行的原理,避免在项目开发中踩坑

Python装饰器执行顺序

话不多说

直接上代码。

def f1(func):
    print("outer f1")

    def wrapper(*args, **kw):
        print("inner f1")
        result = func(*args, **kw)
        return result

    return wrapper


def f2(func):
    print("outer f2")

    def wrapper(*args, **kw):
        print("inner f2")
        result = func(*args, **kw)
        return result

    return wrapper


@f1
@f2
def test(name):
    return "hello, " + name


# 1
print(test("哆啦code梦, test 1"))

# 结果1:
# outer f2
# onter f1
# inner f1
# inner f2
# hello, 哆啦code梦, test 1

print("-" * 50)


# 2
def test(name):
    return "hello, " + name

test = f1(f2(test))
print(test("哆啦code梦, test 2"))

# 结果2:
# outer f2
# onter f1
# inner f1
# inner f2
# hello, 哆啦code梦, test 2

# 结果1 和 结果2的调用方式等价
# 但是Python中的装饰器是按照从内到外的顺序应用的。也就是说,最里面的装饰器最先被应用。
# 如 test = f1(f2(test)) 要执行f1函数,必须先获取f2执行的结果作为f1的参数,所以在装饰器的应用上是从里到外的执行顺序
 
print("-" * 50)


def f1(func):
    print("outer f1")

    def wrapper(*args, **kw):
        result = func(*args, **kw)
        print("inner f1")
        return result

    return wrapper


def f2(func):
    print("outer f2")

    def wrapper(*args, **kw):
        result = func(*args, **kw)
        print("inner f2")
        return func(*args, **kw)

    return wrapper


@f1
@f2
def test(name):
    return "hello, " + name


# 3
print(test("哆啦code梦, test 3"))

# 结果3:
# outer f2
# onter f1
# inner f2
# inner f1
# hello, 哆啦code梦, test 3

PyDev console: starting.
Python 3.10.2


outer f2
onter f1
inner f1
inner f2
hello, 哆啦e梦, test 1
--------------------------------------------------
outer f2
onter f1
inner f1
inner f2
hello, 哆啦e梦, test 2
--------------------------------------------------
outer f2
onter f1
inner f2
inner f1
hello, 哆啦e梦, test 3

# 测试源码

def f1(func):
    print("outer f1")

    def wrapper(*args, **kw):
        print("inner f1")
        result = func(*args, **kw)
        return result

    return wrapper


def f2(func):
    print("outer f2")

    def wrapper(*args, **kw):
        print("inner f2")
        result = func(*args, **kw)
        return result

    return wrapper


@f1
@f2
def test(name):
    return "hello, " + name


# 1
print(test("哆啦code梦, test 1"))
print("-" * 50)


# 2
def test(name):
    return "hello, " + name


test = f1(f2(test))
print(test("哆啦code梦, test 2"))
print("-" * 50)


def f1(func):
    print("outer f1")

    def wrapper(*args, **kw):
        result = func(*args, **kw)
        print("inner f1")
        return result

    return wrapper


def f2(func):
    print("outer f2")

    def wrapper(*args, **kw):
        result = func(*args, **kw)
        print("inner f2")
        return func(*args, **kw)

    return wrapper


@f1
@f2
def test(name):
    return "hello, " + name


# 3
print(test("哆啦code梦, test 3"))

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

您可能感兴趣的文章:
阅读全文