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

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

``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 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")

希望帮助你理解

以上是 关于叠放装饰器的执行顺序问题 的全部内容, 来源链接: utcz.com/a/161426.html

回到顶部