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 3PyDev 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"))
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
