You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python多继承场景下提取通用数据管理逻辑的设计咨询

解决方案:通过抽象基类实现代码复用

这是个很常见的代码复用场景,我们可以借助Python的抽象基类(ABC) + 多继承的方式,完美把重复的manage_data逻辑提取到新基类Base3中,同时保留原有类的继承关系。具体设计思路如下:

核心思路

  1. 让Base3成为一个抽象基类,定义一个抽象方法(比如fetch_data),这个方法由派生类去实现,用来适配不同基类的请求方法。
  2. 把Derived1和Derived2中完全相同的manage_data逻辑放到Base3里,在manage_data中调用抽象的fetch_data方法。
  3. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 12:23:14