关于叠放装饰器的执行顺序问题

``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的 ‘装饰器函数’

阅读 1.8k
1 个回答

你这个装饰器写得是不对的,建议先仔细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 dec1
in dec2

执行 python dec.py

输出

in dec1
in 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")

希望帮助你理解

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题