Mefine 发表于 2022-11-18 11:56:44

使用装饰器后报错,急急急

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',明明已经执行完成了

Mefine 发表于 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方法就不会报错了

Mefine 发表于 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()的注释才能输出结果。原因是什么呢

jackz007 发表于 2022-11-18 12:03:06

本帖最后由 jackz007 于 2022-11-18 12:05 编辑

    return chengfa# 这一句有错已经改正,这个是闭包,要去掉括号,目的为了把内嵌函数公开,让外边可以随便调用

Mefine 发表于 2022-11-18 12:05:03

jackz007 发表于 2022-11-18 12:03


感谢大佬,如果chengfa带上()就不是闭包函数了,是这个意思吗

jackz007 发表于 2022-11-18 21:45:19

本帖最后由 jackz007 于 2022-11-18 21:47 编辑

Mefine 发表于 2022-11-18 12:05
感谢大佬,如果chengfa带上()就不是闭包函数了,是这个意思吗

      是的,如果带上括号,那就成了函数调用了,返回的是函数的调用结果,而不是调用地址,那就无法实现闭包的效果了。

Mefine 发表于 2022-11-22 11:12:30

jackz007 发表于 2022-11-18 21:45
是的,如果带上括号,那就成了函数调用了,返回的是函数的调用结果,而不是调用地址,那就无法实 ...

感谢大佬解答疑惑。。
页: [1]
查看完整版本: 使用装饰器后报错,急急急