找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 1826|回复: 1

[求助] python多装饰器问题

1

主题

1

帖子

1

积分

贫民

积分
1
cqlpxdx 发表于 2018-6-6 10:03:33 | 显示全部楼层 |阅读模式
查阅了各方面资料,不都说多装饰器是按照从上往下执行吗?但是为什么执行结果却是从下往上呢?请看代码以及结果。
  1. def before(func):
  2.     print("run yin before")
  3.     def wrapper(*args,**kwargs):
  4.         print("Before function called")
  5.         return func(*args,**kwargs)

  6.     return wrapper

  7. def after(func):
  8.     print("run in after")
  9.     def wrapper2(*args,**kwargs):
  10.         print("after_func_above")
  11.         result=func(*args,**kwargs)
  12.         print("After function called",args,kwargs)
  13.         return result
  14.     return wrapper2

  15. @before
  16. @after
  17. def test(a,b):
  18.     print(a+b)

  19. test(3,5)
复制代码
执行结果为:
  1. run in after
  2. run yin before
  3. Before function called
  4. after_func_above
  5. 8
  6. After function called (3, 5) {}
复制代码
如果是从上往下的话,第一条结果就应该是run in before,但为什么是run in after呢?谢谢大家
回复

使用道具 举报

0

主题

4

帖子

4

积分

贫民

积分
4
buptkkll 发表于 2018-6-6 15:46:41 | 显示全部楼层
搞搞清楚两个问题:
1)要分清函数和函数调用
2)装饰器函数在被装饰函数定义好后立即执行
当解释器这段代码时,实际上依次调用了 after 和 before ,这是会输出对应的 run in after 和 run yin before。 这时候test 已经相当于 before里的wrapper。但因为 f 并没有被调用,所以 wrapper 并没有调用,依次类推 wrapper 内部的 wrapper2 也没有调用。
最后一行当对test 传入参数进行调用时, wrapper 被调用了,然后调用了 wrapper 2。所以就是这个结果了。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表