鱼C论坛

 找回密码
 立即注册
查看: 1078|回复: 1

[已解决]谁能给解释下这个装饰器是怎么写的?

[复制链接]
发表于 2019-3-4 16:37:33 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
  1. def makebold(f):
  2.     return lambda:"<b>"+ f() + "</b>"


  3. def makeitalic(g):#这里相当于调用了makeitalic = makebold(makeitlalic)
  4.     return lambda:"<i>"+ g() + "</i>"# return lambda x:"<i>"+ g() + "</i>"为什么这里加上一个参数x就一直不正确

  5. #情况一
  6. @makebold
  7. @makeitalic
  8. def say():#这里相当于调用了say = makeitalic(say)=makebold(makeitlalic(say))
  9.     return "hello"

  10. #情况二:
  11. @makebold
  12. @makeitalic
  13. def say(content):#当这里加入参数content后执行就一直报错
  14.     return content
复制代码

其中这个注释对么?还有这个装饰器模式具体是怎么执行的啊?为什么say函数加上参数后就无法执行了?
最佳答案
2019-3-4 21:49:40
1. 添加一个参数 x 不正确是因为不管是情况一还是情况二,在运行时都没有给 makeitalic 函数里的匿名函数传参,而你又设置了参数,所以报错。
2. 对于情况二,加入参数 content 之后报错是因为这里的 content 最终相当于给 makebold 函数里的匿名函数传递的参数,但你有没有给这个匿名函数设置参数,所以它报错。
3. 你的两个问题差不多刚好相反。 你既然都知道
  1. say = makeitalic(say)=makebold(makeitlalic(say))
复制代码

那么也应该知道
  1. say() = makeitalic(say)=makebold(makeitlalic(say))()
  2. say(content) = makeitalic(say)=makebold(makeitlalic(say))(content)
复制代码

至于怎么执行的,就按照上面两行代码一步步解析吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-3-4 21:49:40 | 显示全部楼层    本楼为最佳答案   
1. 添加一个参数 x 不正确是因为不管是情况一还是情况二,在运行时都没有给 makeitalic 函数里的匿名函数传参,而你又设置了参数,所以报错。
2. 对于情况二,加入参数 content 之后报错是因为这里的 content 最终相当于给 makebold 函数里的匿名函数传递的参数,但你有没有给这个匿名函数设置参数,所以它报错。
3. 你的两个问题差不多刚好相反。 你既然都知道
  1. say = makeitalic(say)=makebold(makeitlalic(say))
复制代码

那么也应该知道
  1. say() = makeitalic(say)=makebold(makeitlalic(say))()
  2. say(content) = makeitalic(say)=makebold(makeitlalic(say))(content)
复制代码

至于怎么执行的,就按照上面两行代码一步步解析吧。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-10-13 03:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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