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

Python最佳实践:抽象父类与Mixin类如何处理仅子类定义的属性

最优实现方案

核心思路是通过Python标准库abc模块将父类定义为抽象基类,通过抽象属性强制子类实现约定的属性,同时满足父类不可实例化、消除IDE属性未定义报错、运行时校验实现完整性的需求。

代码实现

依赖导入

from abc import ABC, abstractmethod
from typing import List
import pandas as pd
from pandas import DataFrame

抽象父类定义

class DataLoader(ABC):
    # 强制子类实现类属性output_columns
    @property
    @abstractmethod
    def output_columns(self) -> List[str]:
        ...

    # 强制子类实现实例属性data
    @property
    @abstractmethod
    def data(self) -> DataFrame:
        ...

    def get_data(self) -> DataFrame:
        return self.data.loc[:, self.output_columns]

    def get_meta_data(self) -> DataFrame:
        meta_data_columns = [col for col in self.data.columns if col not in self.output_columns]
        return self.data.loc[:, meta_data_columns]

子类实现(原有逻辑几乎无侵入修改)

class ZodiacSignLoader(DataLoader):
    output_columns = ["name", "zodiac sign"]
    _data: DataFrame

    def __init__(self):
        self._data = self._load_data()

    @property
    def data(self) -> DataFrame:
        return self._data

    def _load_data(self) -> DataFrame:
        # 原有数据加载逻辑保持不变
        pass

class OccupationLoader(DataLoader):
    output_columns = ["name", "occupation"]
    _data: DataFrame

    def __init__(self):
        self._data = self._load_data()

    @property
    def data(self) -> DataFrame:
        return self._data

    def _load_data(self) -> DataFrame:
        # 原有数据加载逻辑保持不变
        pass

方案优势

  1. 抽象基类天然不可实例化,完全符合业务要求
  2. 子类未实现约定属性时,实例化阶段直接抛出TypeError,提前暴露问题,避免调用公共方法时才触发属性不存在的运行时错误
  3. 明确的抽象属性定义和类型标注,让PyCharm等IDE可以准确识别属性的存在与类型,彻底消除属性未定义的报错提示
  4. 公共方法完全抽离至父类,子类仅需实现自身业务逻辑,无冗余代码
  5. 相同逻辑可直接复用在MixIn场景:MixIn类继承ABC并定义所需抽象属性即可,不需要额外改造。

内容的提问来源于stack exchange,提问作者JonnyOhneha

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 08:21:00