Python多继承场景下提取通用数据管理逻辑的设计咨询
解决方案:通过抽象基类实现代码复用
这是个很常见的代码复用场景,我们可以借助Python的抽象基类(ABC) + 多继承的方式,完美把重复的manage_data逻辑提取到新基类Base3中,同时保留原有类的继承关系。具体设计思路如下:
核心思路
- 让
Base3成为一个抽象基类,定义一个抽象方法(比如fetch_data),这个方法由派生类去实现,用来适配不同基类的请求方法。 - 把
Derived1和Derived2中完全相同的manage_data逻辑放到Base3里,在manage_data中调用抽象的fetch_data方法。 Derived1和Derived2同时继承各自的原有基类(Base1/Base2)和Base3,然后实现fetch_data方法,在这个方法里调用对应的request_data_base1或request_data_base2,并传递正确的参数。
完整代码示例
首先导入抽象基类模块:
from abc import ABC, abstractmethod
原有基类保持不变
class Base1(): def request_data_base1(self, argument1, argument2): # Needs to be overridden by the derived class pass class Base2(): def request_data_base2(self, different_argument1, different_argument2, different_argument3): # Needs to be overridden by the derived class pass
新的抽象基类Base3
class Base3(ABC): @abstractmethod def fetch_data(self): # 由派生类实现,负责调用对应的请求方法并传递参数 pass def manage_data(self): # 这里是原来Derived1和Derived2中完全相同的逻辑 data = self.fetch_data() # 以下是数据管理的通用逻辑,示例: # processed_data = self.clean_data(data) # self.save_data(processed_data) return data
修改后的派生类
class Derived1(Base1, Base3): def __init__(self, arg1, arg2): self.arg1 = arg1 self.arg2 = arg2 def request_data_base1(self, argument1, argument2): # 实现具体的请求逻辑 print(f"从服务器1请求数据,参数:{argument1}, {argument2}") return f"服务器1返回的数据" def fetch_data(self): # 适配Base1的请求方法,传递实例保存的参数 return self.request_data_base1(self.arg1, self.arg2) class Derived2(Base2, Base3): def __init__(self, diff_arg1, diff_arg2, diff_arg3): self.diff_arg1 = diff_arg1 self.diff_arg2 = diff_arg2 self.diff_arg3 = diff_arg3 def request_data_base2(self, different_argument1, different_argument2, different_argument3): # 实现具体的请求逻辑 print(f"从服务器2请求数据,参数:{different_argument1}, {different_argument2}, {different_argument3}") return f"服务器2返回的数据" def fetch_data(self): # 适配Base2的请求方法,传递实例保存的参数 return self.request_data_base2(self.diff_arg1, self.diff_arg2, self.diff_arg3)
代码说明
Base3的manage_data完全复用了原来的通用逻辑,不用在每个派生类里重复写,后期修改逻辑只需要改这一处即可。fetch_data作为抽象方法,强制要求每个派生类必须实现,这样保证了不同派生类可以根据自身的请求方法做适配,完美解决了两个基类请求参数不同的问题。- 派生类通过多继承同时获得原有基类的功能和
Base3的通用数据管理功能,结构清晰且符合开闭原则。
测试使用示例
# 测试Derived1 d1 = Derived1("param1", "param2") d1.manage_data() # 会调用request_data_base1,然后执行通用的manage_data逻辑 # 测试Derived2 d2 = Derived2("diff_param1", "diff_param2", "diff_param3") d2.manage_data() # 会调用request_data_base2,然后执行通用的manage_data逻辑
内容的提问来源于stack exchange,提问作者shashashamti2008
相关产品推荐
相关产品推荐

