Python扩展多个相似第三方基类减少代码重复的适配设计模式咨询
最优解决方案:使用混入类(Mixin)实现
这是Python场景下最适配你需求的模式,完全不需要重复写扩展逻辑,代码量最少:
- 首先把你现在写在
MyBase1里的所有扩展逻辑抽离成一个独立的Mixin类,这个类不需要继承任何第三方基类,只写你自己加的属性、方法即可:
class MyBaseExtensionMixin: # 把你原本在MyBase1里写的所有自定义扩展代码全部移到这里 def my_custom_method(self): # 你的扩展逻辑,内部可以正常调用基类的属性/方法 pass @property def my_custom_prop(self): # 你的扩展属性逻辑 pass
- 之后三个自定义子类只需要同时继承对应的第三方基类和这个Mixin就行,不需要重复写任何扩展代码:
class MyBase1(Base1, MyBaseExtensionMixin): # 如果有针对Base1的特殊扩展逻辑,只在这里写独有的部分即可 pass class MyBase2(Base2, MyBaseExtensionMixin): # 同理,只写针对Base2的差异化扩展逻辑,公共逻辑全部来自Mixin pass class MyBase3(Base3, MyBaseExtensionMixin): pass
Python的多重继承会按照方法解析顺序(MRO)优先调用子类的方法,其次是前面的基类,再后面是Mixin,完全符合你的需求:第三方基类的原生方法、你扩展的方法都可以正常调用,不会冲突。
备选方案:类工厂函数
如果你的三个自定义子类连差异化逻辑都几乎没有,可以直接写一个工厂函数批量生成对应的类,连重复写三个类定义的代码都省了:
def create_my_base(base_cls, *init_args, **init_kwargs): class MyBase(base_cls, MyBaseExtensionMixin): # 可以在这里统一处理所有通用的初始化逻辑 def __init__(self): super().__init__(*init_args, **init_kwargs) # 可选:统一设置类名,方便后续调试识别 MyBase.__name__ = f"My{base_cls.__name__}" return MyBase # 直接批量生成三个自定义类 MyBase1 = create_my_base(Base1) MyBase2 = create_my_base(Base2) MyBase3 = create_my_base(Base3)
这个方案的优势是后期如果新增Base4/Base5,只需要加一行生成代码就行,维护成本更低。
选型建议
- 如果三个自定义子类有少量各自的独有扩展逻辑,选Mixin+单独类定义的方案,扩展性更好
- 如果三个自定义子类完全没有差异化扩展逻辑,选类工厂方案,代码更简洁
内容的提问来源于stack exchange,提问作者Jansen
相关产品推荐
相关产品推荐

