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
方案优势
- 抽象基类天然不可实例化,完全符合业务要求
- 子类未实现约定属性时,实例化阶段直接抛出
TypeError,提前暴露问题,避免调用公共方法时才触发属性不存在的运行时错误 - 明确的抽象属性定义和类型标注,让PyCharm等IDE可以准确识别属性的存在与类型,彻底消除属性未定义的报错提示
- 公共方法完全抽离至父类,子类仅需实现自身业务逻辑,无冗余代码
- 相同逻辑可直接复用在MixIn场景:MixIn类继承ABC并定义所需抽象属性即可,不需要额外改造。
内容的提问来源于stack exchange,提问作者JonnyOhneha
相关产品推荐
相关产品推荐

