Python装饰器Bug排查:类方法调用返回None而非预期值
问题分析与修复方案
你遇到的问题核心在于装饰器的wrapper函数没有返回原函数的执行结果。
咱们来理清楚背后的逻辑:
- 当你用
@LogClassFuncInfos装饰getName方法后,调用a.getName()本质上执行的是装饰器里的wrapper函数 - 原
getName方法会返回self.name(也就是'test'),但你的wrapper函数只调用了func(*s, **gs),却没把这个返回值传递出去 - Python里如果函数没有显式的
return语句,默认会返回None,这就是你看到输出None的原因
修复后的代码
只需要在wrapper函数里添加一行返回原函数执行结果的代码即可:
import time import sys def LogClassFuncInfos(func): def wrapper(*s, **gs): methodName = format(func.__name__) print(methodName) # 返回原函数的执行结果,补上这一行就解决问题了 return func(*s, **gs) return wrapper class NameModel(): def __init__(self): self.name = 'test' @LogClassFuncInfos def getName(self): return self.name a = NameModel() print(a.getName())
验证结果
运行修复后的代码,会先打印方法名getName,然后输出你预期的test,完全符合需求。
内容的提问来源于stack exchange,提问作者Qiang Zhang
相关产品推荐
相关产品推荐

