Python基类调用重写方法异常求助:Child.add_2(5)返回值不符预期
问题分析与解决方案
让我们一步步拆解你遇到的问题,理清代码运行的逻辑:
为什么Child.add_2(5)返回7而不是9?
核心问题出在Parent类中add_2的实现逻辑上,先看这段代码:
@classmethod def add_2(cls, number): plus_1 = cls.add_1(number) plus_2 = cls.add_1(number) return plus_2
你两次调用add_1时,传入的都是原始的number(也就是5),而不是把第一次调用的结果作为第二次的参数。
当执行Child.add_2(5)时:
cls指向Child类,第一次调用cls.add_1(5)返回5+2=7;- 第二次依然调用
cls.add_1(5),结果还是7; - 最后返回
plus_2,自然得到7。
而你期望的是连续两次累加(5→7→9),当前逻辑和预期不匹配,这就是结果不符合预期的根本原因。
另外还有个细节问题:Parent类中的add_1是普通实例方法(没有@classmethod装饰器),但参数名用了cls,这会造成混淆。虽然子类重写后用了类方法暂时没报错,但这种写法不符合Python编码规范,建议统一改成类方法。
不需要重写add_2的简洁解决方案
只需要修正Parent类中add_2的逻辑,同时把Parent.add_1改成类方法保持一致性:
class Parent: @classmethod def add_2(cls, number): plus_1 = cls.add_1(number) plus_2 = cls.add_1(plus_1) # 用第一次的结果作为第二次的参数 return plus_2 @classmethod # 添加类方法装饰器,和子类实现统一 def add_1(cls, number): return number + 1 class Child(Parent): @classmethod def add_1(cls, number): return number + 2 # 测试结果 print(Child.add_1(5)) # 输出7 print(Child.add_2(5)) # 输出9,符合你的期望
修改后,add_2会连续调用两次add_1,自动继承子类的add_1实现,完全不需要在子类中重写add_2,既简洁又符合面向对象的继承逻辑。
内容的提问来源于stack exchange,提问作者rondo9
相关产品推荐
相关产品推荐

