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
相关产品推荐
相关产品推荐

