关于叠放装饰器的执行顺序问题
``def decorator(func):
print('----------开始--------------')func()
print('----------结束--------------')
return func
def decorator2(func):
print('装饰器内部')def add1():
print('----------开始2--------------')
func()
print('----------结束2--------------')
return add1
@decorator2
@decorator
def test():
print('我是test函数')
test()
``
输出结果:
----------开始--------------
我是test函数
----------结束--------------
装饰器内部
----------开始--------------
我是test2函数
----------结束--------------
我是test2函数
搜百度都说叠放装饰器都是自上而下执行的,为什么我这里没有先打印出decorator2的 ‘装饰器函数’
回答:
你这个装饰器写得是不对的,建议先仔细copy教程代码的装饰器函数、包裹函数、被修饰函数三层结构,明确被修饰函数在被调用时究竟真正执行的是哪一层函数。
然后你需要深入理解Python 在 import 时 和 运行时 分别执行哪部分代码
代码 dec.py
#!/usr/bin/env python# -*- coding: utf-8 -*-
def dec1(func):
print("in dec1")
def wrap(*args, **kwargs):
print("in dec1 wrap")
func(*args, **kwargs)
return wrap
def dec2(func):
print("in dec2")
def wrap(*args, **kwargs):
print("in dec2 wrap")
func(*args, **kwargs)
return wrap
@dec2
@dec1
def foo(instr):
print(instr)
if __name__ == '__main__':
foo("hello world")
执行 python -c 'import dec
输出
in dec1in dec2
执行 python dec.py
输出
in dec1in dec2
in dec2 wrap
in dec1 wrap
hello world
从 @dec2
这一行代码开始,你可以替换理解为
def foo(instr): print(instr)
real_call_foo = dec2(dec1(foo))
if __name__ == '__main__':
real_call_foo("hello wold")
希望帮助你理解
以上是 关于叠放装饰器的执行顺序问题 的全部内容, 来源链接: utcz.com/a/161426.html