设为首页收藏本站论坛APP下载
查看: 25|回复: 2

一个函数有两层或者多层的装饰器

[复制链接]

2

主题

3

帖子

26

积分

初级VIP会员

Rank: 1

积分
26
发表于 2018-10-9 16:26:05 | 显示全部楼层 |阅读模式
  1. def makeBold(fun):
  2.     print('----a----')

  3.     def inner():
  4.         print('----1----')
  5.         return '<b>' + fun() + '</b>'

  6.     return inner


  7. def makeItalic(fun):
  8.     print('----b----')

  9.     def inner():
  10.         print('----2----')
  11.         return '<i>' + fun() + '</i>'

  12.     return inner


  13. @makeBold
  14. @makeItalic
  15. def test():
  16.     print('----c----')
  17.     print('----3----')
  18.     return 'hello python decorator'


  19. ret = test()
  20. print(ret)
  21. ```
  22. ```
  23. 输出结果:



  24. ----b----
  25. ----a----
  26. ----1----
  27. ----2----
  28. ----c----
  29. ----3----
  30. <b><i>hello python decorator</i></b>
  31. ```
复制代码
比如这段代码,想请教老师为何在makeItalic装饰完后,很显然此时的test指向makeItalic的inner函数地址,为什么这时候会先返回来执行@makeBold,而不是把makeItalic全部执行完后再执行makeBold,另外有多层装饰器的时候,想听老师讲一下。
最后代码执行的结果
  1. 输出结果:



  2. ----b----
  3. ----a----
  4. ----1----
  5. ----2----
  6. ----c----
  7. ----3----
  8. <b><i>hello python decorator</i></b>
复制代码


回复

使用道具 举报

0

主题

31

帖子

155

积分

中级VIP会员

Rank: 2

积分
155
发表于 2018-10-9 18:16:36 | 显示全部楼层
同学你好,我是for,你这个问题很简单也只是重复调用而已,首先你双重装饰器 test = makeBold(makeItalic(test))
1. makelialic(test) 就是返回makeltalic函数中的inner,并没有调用
2. makeblod(makeltaic(test))这个是直接返回makeblod中的inner 还是没有调用,
3. test()先调用的makeblod中的inner  然后调用之后发现fun() 就是调用makeltalic中的inner
思密达
回复 支持 反对

使用道具 举报

2

主题

3

帖子

26

积分

初级VIP会员

Rank: 1

积分
26
 楼主| 发表于 2018-10-9 20:32:29 | 显示全部楼层
腾讯-学神IT-For 发表于 2018-10-9 18:16
同学你好,我是for,你这个问题很简单也只是重复调用而已,首先你双重装饰器 test = makeBold(makeItalic(t ...

ok,了解了,跟for老师刚完收工
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 使用vip格式注册

本版积分规则

咨询QQ

学神论坛APP下载地址
快速回复 返回顶部 返回列表