Python中如何避免因微小代码改动重写父类方法
Python中如何避免因微小代码改动重写父类方法
嘿,这个问题我太有共鸣了!遇到这种大部分代码重复、只有一点点差异的情况,完全没必要把整个方法再抄一遍,咱们可以用几种优雅的方式重构代码,既减少重复又方便维护。
方案一:提取可变部分为类/实例属性
最直接的思路是把不同的标签键("label_1"和"label_2")变成类的属性,父类定义默认值,子类只需要重写这个属性就行,核心逻辑留在父类的__getitem__里。
示例代码:
class Class1: def __init__(self): self.label_key = "label_1" # 父类默认标签键 # 其他初始化逻辑... def __getitem__(self, index): # ...原来的一堆代码 a = query[self.label_key].iat[index] # ...原来的后续操作 return a class Class2(Class1): def __init__(self): super().__init__() self.label_key = "label_2" # 子类只修改这个属性 # 其他子类特有的初始化逻辑...
这样一来,子类Class2完全不用重写__getitem__,只需要在初始化时替换掉label_key就行,完美复用父类的所有逻辑。
方案二:用钩子方法(Hook Method)实现灵活扩展
如果以后标签键的生成逻辑可能更复杂(比如不是固定字符串,而是根据某些参数动态生成),那用钩子方法会更合适。父类定义一个获取标签键的方法,子类重写这个方法即可:
示例代码:
class Class1: def _get_label_key(self): # 父类的钩子方法,返回默认标签键 return "label_1" def __getitem__(self, index): # ...原来的一堆代码 label_key = self._get_label_key() a = query[label_key].iat[index] # ...原来的后续操作 return a class Class2(Class1): def _get_label_key(self): # 子类重写钩子方法,返回自己的标签键 return "label_2"
这种方式的好处是灵活性更高——如果哪天Class2需要根据实例的状态动态生成标签键,直接修改_get_label_key的逻辑就行,完全不影响核心的__getitem__方法。
总结
这两种方案都能帮你避免重复代码,核心思路都是把变化的部分和不变的核心逻辑分离。如果只是固定字符串的差异,方案一足够简单;如果需要更灵活的逻辑,方案二更适合。
备注:内容来源于stack exchange,提问作者NewbieInFlask
相关产品推荐
相关产品推荐

