Python 3.x 类继承中returnConstant返回None的问题排查
Python 继承场景下变量x获取None值的问题分析
根本原因
问题的核心来自两个Python语法规则的叠加,结合代码执行流可以逐段对应:
- Python 中所有函数/方法,如果没有显式写
return语句指定返回值,执行完毕后会默认返回None。 - 子类重写父类方法时,内部显式调用父类同名方法,不会自动把父方法的返回值作为子类重写方法的返回值。
对应到代码的实际执行链路:
- 进入
Parent.getSomeValue方法时,代码x = self.returnConstant()里的self是Child类实例,按照Python的多态规则,会优先调用Child类重写的returnConstant方法,而不是直接调用父类的同名方法 - Child类的
returnConstant方法内部仅打印了日志、执行了父类returnConstant的调用,但没有把父类方法返回的字符串'A'通过return语句向外传递,因此这个重写方法整体执行完会返回默认的None - 最终
Parent.getSomeValue里拿到的x就是这个None,和观察到的运行结果完全一致。
修复方案
只需要对Child类的returnConstant方法做最小改动:加上return关键字,把父类方法的返回值透传出去即可。
修改后的方法实现:
def returnConstant(self): print("returnConstant Child") # 加上return,将父类方法的返回值向上传递 return Parent.returnConstant(self)
修改后重新运行程序,预期输出为:
Init Child getSomeValue Child getSomeValue Parent returnConstant Child returnConstant Parent A
补充注意点
- 不要混淆“方法内部调用父类方法”和“方法返回值传递”的逻辑:任何层级的方法调用,只要当前方法没有显式返回值,就会返回None,父方法的返回值不会自动冒泡到上层调用方
- 如果子类重写的方法不需要扩展逻辑、完全复用父类实现,可以直接删掉子类中对应的重写方法,让实例直接走父类的方法逻辑,避免不必要的透传问题
内容的提问来源于stack exchange,提问作者user5012562
相关产品推荐
相关产品推荐

