美文网首页
python 装饰器执行顺序

python 装饰器执行顺序

作者: 老子与赫本 | 来源:发表于2020-03-18 14:30 被阅读0次

先上代码和效果

def wrapper_a(func):      #1      #3
    print(' in  wrapper_a')      #4
    def inner_a(*args, **kwargs):  #5  #15
        print('start inner_a') #16
        func(*args, **kwargs)  #17
        print('stop inner_a')  #20
    return inner_a     #6

def wrapper_b(func):    #2    #7
    print('in wrapper_b')  #8 
    def inner_b(*args, **kwargs):  #9   #12
        print('start inner_b')   #13
        func(*args, **kwargs)  #14
        print('stop Inner_b') #21
    return inner_b   #10

@wrapper_b
@wrapper_a
def f(x):      
    print 'in f'   #18
    return x  #19
f(3)    #11

输出:

in wrapper_a
in wrapper_b
start inner_b
start inner_a
in f
stop Inner_a
stop Inner_b
@wrapper_b    #
@wrapper_a
def f(x):   #
    print 'in f'
    return x 

# 相当于
f = wrapper_b(wrapper_a(f))

执行步骤详解:

定义阶段

  1. 定义wrapper_a
  2. 定义wrapper_b
  3. 进入wrapper_a, 参数func指代 f(x)
  4. 输出 "in wrapper_a"
  5. 定义inner_a ===> inner_a(*args, **kwargs)[parent=f1]
  6. 返回innder_a对象====>inner_a(*args, **kwargs)[parent=f1]
  7. 进入wrapper_b, 此时wrapper_b的参数func为inner_a(*args, **kwargs)
  8. 输出'in wrapper_b'
  9. 定义inner_b =====>inner_b(*args, **kwargs)[parent=f2]
  10. 返回inner_b对象 ====>inner_b(*args, **kwargs)[parent=f2]

执行阶段

  1. 执行f(3),此时的f函数指的是inner_b(*args, **kwargs) [parent=f2]
  2. 执行inner_b函数,此时args=(3,), kwargs={}
  3. 输出'start inner_b'
  4. 调用innder_b中的func,就是inner_a(*args, **kwargs)
  5. 执行inner_a(*args, **kwargs) 此时的args=(3,), kwargs={}
  6. 输出'start inner_a'
  7. 执行inner_a中的func,就是被装饰的函数f
  8. 输出"in f"
  9. 退出函数f
  10. 输出"stop inner_a"
  11. 输出 "stop Inner_b'"

相关文章

  • Python 装饰器执行顺序迷思

    探究多个装饰器执行顺序 装饰器是Python用于封装...

  • python 装饰器执行顺序

    先上代码和效果 输出: 执行步骤详解: 定义阶段 定义wrapper_a 定义wrapper_b 进入wrappe...

  • 多个装饰器存在时的执行顺序

    装饰器的执行顺序是怎样的? 装饰器函数的执行顺序分为定义阶段和执行阶段,装饰器函数在被装饰函数定义好后立即执行 在...

  • Python 入门之多个装饰器执行顺序

    装饰器是 Python 用于封装函数或代码的工具,网上可以搜到很多文章可以学习,在这里要讨论的是多个装饰器执行顺序...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

  • python中装饰器的装饰顺序和执行顺序

    在python语言中“装饰器”模式被设计成语言内置的设计模式,使得使用该模式变得简单,仅仅需要在目标函数前使用‘@...

  • 关于python多重装饰器的执行顺序

    装饰器是Python用于封装函数或代码的工具,网上可以搜到很多文章可以学习,我在这里要讨论的是多个装饰器执行顺序。...

  • Day05

    一、装饰器进阶 多个装饰器同时装饰一个函数,执行顺序是由上往下执行被装饰函数执行之前的操作,再执行被装饰函数,最后...

  • 装饰器5

    装饰器嵌套 语法糖执行顺序def fun_a(func): print("装饰器fun_a")def funct...

  • 函数装饰器执行顺序

    当一个函数有多个装饰器时,会优先执行离函数最近的装饰器,由于装饰器返回的是函数的函数名引用,并非真正调用函数。

网友评论

      本文标题:python 装饰器执行顺序

      本文链接:https://www.haomeiwen.com/subject/hhnqyhtx.html