鱼C论坛

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

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

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

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

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

x
def jiujiu(func):
    def chengfa():
        print('未执行九九乘法')
        res = func()
        print('九九乘法已打印完成')
        return res
    return chengfa()

@jiujiu
def jiujiuchengfa():
    for i in range(1, 10):
        for j in range(1, i + 1):
            print("%s * %s = %s" % (j, i, j * i), end=" ")
        print("")


if __name__ == '__main__':
    jiujiuchengfa()

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

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

使用道具 举报

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

@jiujiu
def jiujiuchengfa():
    for i in range(1, 10):
        for j in range(1, i + 1):
            print("%s * %s = %s" % (j, i, j * i), end=" ")
        print("")


# if __name__ == '__main__':
#     jiujiuchengfa()


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

使用道具 举报

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

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

#fun_b()  # 实际上执行的是装饰器内层函数function

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

使用道具 举报

发表于 2022-11-18 12:03:06 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-11-18 12:05 编辑
    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-12-25 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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