鱼C论坛

 找回密码
 立即注册
查看: 3128|回复: 12

[已解决]关于修饰符的问题

[复制链接]
发表于 2020-2-14 15:55:26 | 显示全部楼层 |阅读模式

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

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

x
  1. def something():
  2.     print("I love FishC.com!")

  3. @something
  4. def f():
  5.     print("I love FishC.com!")

  6.     return f()

  7. something()
复制代码



这个代码应该怎么改才能打印两次    I love FishC.com!    呢?

谢谢啊
最佳答案
2020-2-14 16:01:02
  1. >>> def two(fun):
  2.         def inner():
  3.                 print('I love FishC.com!')
  4.                 fun()
  5.                 print('I love FishC.com!')
  6.         return inner

  7. >>> @two
  8. def f():
  9.         print('主程序')

  10.        
  11. >>> f()
  12. I love FishC.com!
  13. 主程序
  14. I love FishC.com!
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-2-14 15:58:27 | 显示全部楼层
你的装饰器定义有误。应该这样:

  1. def something(function):
  2.     def fun():
  3.         print("I love FishC.com!")
  4.         function()
  5.     return fun


  6. @something
  7. def f():
  8.     print("I love FishC.com!")


  9. f()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 16:01:02 | 显示全部楼层    本楼为最佳答案   
  1. >>> def two(fun):
  2.         def inner():
  3.                 print('I love FishC.com!')
  4.                 fun()
  5.                 print('I love FishC.com!')
  6.         return inner

  7. >>> @two
  8. def f():
  9.         print('主程序')

  10.        
  11. >>> f()
  12. I love FishC.com!
  13. 主程序
  14. I love FishC.com!
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 16:01:15 | 显示全部楼层
因为
  1. @something
  2. def f():
  3.     print("I love FishC.com!")
复制代码

等于
  1. def something():
  2.     print("I love FishC.com!")
  3.     f()
复制代码

所以要这样改:
  1. def something(func):
  2.     print("I love FishC.com!")

  3. @something
  4. def f():
  5.     print("I love FishC.com!")

  6.     return f()

  7. something(f)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-14 16:54:16 | 显示全部楼层

那为什么  something()要加一个func呢?
  1. [code]@something
  2. def f():
  3.     print("I love FishC.com!")

  4. # 相当于

  5. def f():
  6.     print("I love FishC.com!")

  7. f = something(f)
复制代码
[/code]

这个答案中f = something(f)  又是什么意思呢   
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-14 16:59:38 | 显示全部楼层

感觉这函数里并没有参数啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 17:02:51 | 显示全部楼层
mcdmcd 发表于 2020-2-14 16:59
感觉这函数里并没有参数啊

你用了装饰器,所以就有了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 17:05:46 | 显示全部楼层
mcdmcd 发表于 2020-2-14 16:54
那为什么  something()要加一个func呢?[/code]

这个答案中f = something(f)  又是什么意思呢

不用装饰器就可以不加参数
但你用了,也就是说
  1. @something
  2. def f:
复制代码

等于
  1. something(f)
复制代码

前后者相等,所以something里要加一个参数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-14 17:14:02 | 显示全部楼层
qiuyouzhi 发表于 2020-2-14 17:02
你用了装饰器,所以就有了

就相当于 f()成了something()的参数了?func   =  f 被调用了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 18:45:55 | 显示全部楼层
mcdmcd 发表于 2020-2-14 17:14
就相当于 f()成了something()的参数了?func   =  f 被调用了?

对对对
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-2-14 19:27:17 | 显示全部楼层

那如果写好了一个没有参数函数    在下边用装饰器使用它的时候    还要回去给他加上一个函数吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 19:58:09 | 显示全部楼层
mcdmcd 发表于 2020-2-14 19:27
那如果写好了一个没有参数函数    在下边用装饰器使用它的时候    还要回去给他加上一个函数吗?

嗯,加上一个参数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-14 20:00:44 | 显示全部楼层
mcdmcd 发表于 2020-2-14 19:27
那如果写好了一个没有参数函数    在下边用装饰器使用它的时候    还要回去给他加上一个函数吗?

嗯,加上一个参数
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-3 06:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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