重写方法一致但基类不同,如何优化重复的派生类实现?
消除Mock类重复代码的简洁写法
首选方案:用Mixin类复用公共逻辑
把两个Mock类里重复的__init__和my_func抽出来做成一个Mixin类,让Mock1、Mock2分别继承这个Mixin和对应的基类即可,完全不需要动态切换继承关系。
示例代码
class Base: # 原有定义省略 def my_func(self, for_val): # 基类原实现 pass class Derived(Base): # 原有定义省略 pass # 抽取公共逻辑到Mixin类(仅用于代码复用,不单独实例化) class MockMixin: def __init__(self, input, args): self._input = input super().__init__(args) # 自动根据MRO调用下一个类的构造方法 def my_func(self, for_val): # 这里写两个Mock类原本重复的my_func实现 # definition omitted pass # 定义Mock类,继承顺序Mixin在前,目标基类在后 class Mock1(MockMixin, Base): pass class Mock2(MockMixin, Derived): pass
为什么这么做可行?
- Mixin是Python里专门用来复用代码的模式,通过多继承让公共逻辑被多个类共享。
- Python的方法解析顺序(MRO)会优先调用Mixin里的方法,刚好覆盖Base中的
my_func,符合需求。 - 用无参数的
super()不用硬编码类名,后续修改基类时不需要改动Mixin的代码。
备选方案:类工厂函数
如果不想用多继承,可以写一个工厂函数,动态生成继承指定基类的Mock类:
def create_mock(base_class): class GeneratedMock(base_class): def __init__(self, input, args): self._input = input super().__init__(args) def my_func(self, for_val): # 统一的my_func实现 # definition omitted pass return GeneratedMock # 创建需要的Mock类 Mock1 = create_mock(Base) Mock2 = create_mock(Derived)
这种方式通过函数封装重复逻辑,动态生成类,同样能避免代码重复,适合偏好单继承风格的场景。
内容的提问来源于stack exchange,提问作者roulette01
相关产品推荐
相关产品推荐

