不可修改基类时,如何优雅扩展带回调的基类方法?
如何优雅解决该问题?
这个问题其实可以通过包装回调函数的方式优雅解决,毕竟咱们没法修改基类,那就在子类里给原回调加一层“逻辑外衣”,既复用基类的前置代码,又实现自己的条件判断需求。
核心思路
既然基类的useful_method最后一定会调用self.callback(),那我们不需要重写整个方法,只需要把原回调替换成一个带条件判断的包装版本:
- 在子类初始化时,先调用基类的
__init__拿到原始回调 - 定义一个新的包装函数,里面加入
condition的判断逻辑:只有当condition为真时,才执行原始回调,之后重置condition - 把基类的
self.callback替换成这个包装后的函数 - 子类的
useful_method直接调用基类的实现,完全复用前置的do_something()和do_more_stuff()
具体代码实现
class MyClass(BaseClass): def __init__(self, callback, *args, **kwargs): super().__init__(callback, *args, **kwargs) # 保存原始的回调函数 self._original_callback = self.callback # 定义带条件判断的包装回调 def wrapped_callback(): # 这里的condition是MyClass的实例属性,记得提前初始化 if self.condition: # 执行原始回调 callback_result = self._original_callback() # 回调执行完成后重置条件 self.condition = False return callback_result # 替换基类的callback为包装后的版本 self.callback = wrapped_callback def useful_method(self): # 直接复用基类的全部前置逻辑,不需要重复写do_something和do_more_stuff super().useful_method()
方案优势
- 完全避免了代码重复:基类
useful_method里的do_something()、do_more_stuff()逻辑被完整复用 - 逻辑解耦:条件判断逻辑被封装在回调包装里,和基类逻辑完全分离
- 符合需求等效性:最终效果和你期望的子类重写逻辑完全一致,而且不需要修改基类代码
注意:记得在MyClass的__init__里初始化self.condition(比如self.condition = True),确保判断逻辑能正常工作。
内容的提问来源于stack exchange,提问作者principal
相关产品推荐
相关产品推荐

