You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)时:

  1. cls指向Child类,第一次调用cls.add_1(5)返回5+2=7;
  2. 第二次依然调用cls.add_1(5),结果还是7;
  3. 最后返回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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:22:48