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

Python类方法条件重写需求:无法访问原方法实现

解决方案:用super()复用父类方法逻辑

这问题我太熟了!当你没法直接获取父类方法的具体实现,但又想在子类重写的方法里,特定条件下保留父类原有行为时,Python内置的super()函数就是完美解决方案——它能帮你安全调用父类中对应的方法,完全不需要关心父类方法内部写了什么。

针对你的代码,修改后的ChildClass应该是这样:

class DefaultClass(object):
    def __init__(self):
        self.number = 5
    def do_something(self, x):
        self.number = self.number * x
        return self.number

class ChildClass(DefaultClass):
    def __init__(self):
        # 重要:必须调用父类的__init__方法!
        # 不然父类初始化的self.number会不存在,调用父类方法会报错
        super().__init__()
        self.flag = False
    
    def do_something(self, x):
        if self.flag is False:
            # 直接调用父类的do_something,完全复用原有逻辑
            return super().do_something(x)
        else:
            self.number = self.number + x
            return self.number

几个关键细节要注意:

  • 不要漏掉父类的初始化:你原来的ChildClass.__init__没有调用父类的构造方法,这会导致self.number根本没被初始化,调用父类的do_something时会直接抛出AttributeError。用super().__init__()就能让父类完成它该做的初始化工作。
  • super().do_something(x)的作用:这行代码会精准调用父类DefaultClass中的do_something方法,不管父类方法内部是乘法还是其他逻辑,你都不需要复制代码,直接复用原有行为就行。
  • 记得返回父类方法的返回值:因为父类的do_something有返回值,所以调用后要把这个返回值返回出去,保证方法的行为和父类保持一致。

你可以测试一下这段代码:

test_obj = ChildClass()
print(test_obj.do_something(2))  # flag为False,走父类逻辑,输出10
test_obj.flag = True
print(test_obj.do_something(3))  # flag为True,走子类自定义逻辑,输出13

这样就完美实现了你要的需求:特定条件下保留父类原有行为,其他情况执行自定义逻辑,而且全程不需要知道父类方法的具体实现~

内容的提问来源于stack exchange,提问作者Artur Baruchi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:39:52