Python装饰器报错:'NoneType'对象不可调用,求代码修改方案
Python装饰器错误修正与原理说明
错误原因
- 装饰器的核心逻辑是接收一个函数作为参数,返回一个新的可调用函数,你写的
mes函数只做了打印操作,没有返回任何函数,执行后默认返回None。 - 使用
@mes装饰name时,Python会自动执行name = mes(name),这就把原本的name函数替换成了None,后续调用name()自然会触发TypeError: 'NoneType' object is not callable。 - 最后一行
print(mes(name()))完全错误,此时name已经是None,调用name()直接触发报错。
修正方案
方案一:正确实现装饰器(推荐)
这是符合装饰器规范的写法,能体现装饰器的增强功能:
def mes(func): # 定义包装函数,负责扩展原函数的行为 def wrapper(): # 调用原name函数获取返回值,再拼接打印 print("Hello " + func()) # 必须返回包装函数,保证被装饰后的name仍是可调用对象 return wrapper @mes def name(): return "Nicky" # 直接调用被装饰后的name函数,自动执行包装逻辑 name()
方案二:简化调用(不使用装饰器)
如果只是想快速得到期望输出,也可以去掉装饰器,直接传递参数调用:
def mes(text): print("Hello " + str(text)) def name(): return "Nicky" # 把name函数的返回值作为参数传给mes mes(name())
装饰器基础要点
装饰器是Python的语法糖,@装饰器函数等价于被装饰函数 = 装饰器函数(被装饰函数)。所以装饰器必须满足两个条件:
- 能接收一个函数作为参数
- 返回一个可调用的对象(通常是另一个函数)
只有这样,被装饰后的函数才不会变成None,依然可以正常调用。
内容的提问来源于stack exchange,提问作者stranger12309
相关产品推荐
相关产品推荐

