鱼C论坛

 找回密码
 立即注册
查看: 2779|回复: 6

[已解决]使用装饰器后报错,急急急

[复制链接]
发表于 2022-11-18 11:56:44 | 显示全部楼层 |阅读模式

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

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

x
  1. def jiujiu(func):
  2.     def chengfa():
  3.         print('未执行九九乘法')
  4.         res = func()
  5.         print('九九乘法已打印完成')
  6.         return res
  7.     return chengfa()

  8. @jiujiu
  9. def jiujiuchengfa():
  10.     for i in range(1, 10):
  11.         for j in range(1, i + 1):
  12.             print("%s * %s = %s" % (j, i, j * i), end=" ")
  13.         print("")


  14. if __name__ == '__main__':
  15.     jiujiuchengfa()
复制代码


执行结果:
  1. Traceback (most recent call last):
  2.   File "D:\Project\git-test-lmf\p01\m_01.py", line 370, in <module>
  3.     jiujiuchengfa()
  4. TypeError: 'NoneType' object is not callable
  5. 未执行九九乘法
  6. 1 * 1 = 1
  7. 1 * 2 = 2 2 * 2 = 4
  8. 1 * 3 = 3 2 * 3 = 6 3 * 3 = 9
  9. 1 * 4 = 4 2 * 4 = 8 3 * 4 = 12 4 * 4 = 16
  10. 1 * 5 = 5 2 * 5 = 10 3 * 5 = 15 4 * 5 = 20 5 * 5 = 25
  11. 1 * 6 = 6 2 * 6 = 12 3 * 6 = 18 4 * 6 = 24 5 * 6 = 30 6 * 6 = 36
  12. 1 * 7 = 7 2 * 7 = 14 3 * 7 = 21 4 * 7 = 28 5 * 7 = 35 6 * 7 = 42 7 * 7 = 49
  13. 1 * 8 = 8 2 * 8 = 16 3 * 8 = 24 4 * 8 = 32 5 * 8 = 40 6 * 8 = 48 7 * 8 = 56 8 * 8 = 64
  14. 1 * 9 = 9 2 * 9 = 18 3 * 9 = 27 4 * 9 = 36 5 * 9 = 45 6 * 9 = 54 7 * 9 = 63 8 * 9 = 72 9 * 9 = 81
  15. 九九乘法已打印完成
复制代码


求救,这里为什么会报错‘NoneType',明明已经执行完成了
最佳答案
2022-11-18 12:03:06
本帖最后由 jackz007 于 2022-11-18 12:05 编辑
  1.     return chengfa  # 这一句有错已经改正,这个是闭包,要去掉括号,目的为了把内嵌函数公开,让外边可以随便调用
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-11-18 12:00:06 | 显示全部楼层
  1. def jiujiu(func):
  2.     def chengfa():
  3.         print('未执行九九乘法')
  4.         res = func()
  5.         print('九九乘法已打印完成')
  6.         return res
  7.     return chengfa()

  8. @jiujiu
  9. def jiujiuchengfa():
  10.     for i in range(1, 10):
  11.         for j in range(1, i + 1):
  12.             print("%s * %s = %s" % (j, i, j * i), end=" ")
  13.         print("")


  14. # if __name__ == '__main__':
  15. #     jiujiuchengfa()
复制代码



注释掉main方法就不会报错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-18 12:01:41 | 显示全部楼层
  1. def fun_a(func): # fun_b函数的地址
  2.     def function():
  3.         print("函数执行前的操作")
  4.         res = func() # 调用fun_b函数
  5.         print("函数执行之后的操作")
  6.         return res # 返回fun_b()函数的返回值
  7.     return function # 返回闭包内层函数地址,方便用户调用

  8. @fun_a  # 这种写法,等价于  fun_b=fun_a(fun_b)
  9. def fun_b():
  10.     print("执行fun_b函数")

  11. #fun_b()  # 实际上执行的是装饰器内层函数function
复制代码


同样的方法,fun_b()注释掉后console并不会输出结果了,需要解除fun_b()的注释才能输出结果。原因是什么呢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-18 12:03:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-18 12:05 编辑
  1.     return chengfa  # 这一句有错已经改正,这个是闭包,要去掉括号,目的为了把内嵌函数公开,让外边可以随便调用
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-18 12:05:03 | 显示全部楼层


感谢大佬,如果chengfa带上()就不是闭包函数了,是这个意思吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-11-18 21:45:19 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2022-11-18 21:47 编辑
Mefine 发表于 2022-11-18 12:05
感谢大佬,如果chengfa带上()就不是闭包函数了,是这个意思吗


      是的,如果带上括号,那就成了函数调用了,返回的是函数的调用结果,而不是调用地址,那就无法实现闭包的效果了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-11-22 11:12:30 | 显示全部楼层
jackz007 发表于 2022-11-18 21:45
是的,如果带上括号,那就成了函数调用了,返回的是函数的调用结果,而不是调用地址,那就无法实 ...

感谢大佬解答疑惑。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-19 07:17

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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