通用数据处理算法的关键在于约定行为接口而非预设类型,通过鸭子类型、内置多态和抽象基类实现灵活可扩展的多态设计。

编写通用的数据处理算法,关键不在于预设数据类型,而在于约定行为接口。只要对象能响应特定方法或协议,就能被同一段逻辑处理——这正是多态在实际工程中最有力的体现。
用统一接口抽象不同数据源
不必为 CSV、JSON、数据库查询结果或 API 响应分别写处理函数。定义一个具备 get_rows() 和 filter_by(key, value) 方法的“数据容器”接口,各类数据源只需实现这两个方法:
- CSV 类返回
csv.DictReader迭代器 - JSON 类解析后返回字典列表
- 数据库类执行 SQL 并封装成一致结构
主处理函数只调用 container.get_rows(),完全不关心底层是文件还是网络请求。
借助鸭子类型支持任意可迭代对象
Python 的多态天然适配迭代协议。你的算法可直接接收任何实现了 __iter__ 或 __getitem__ 的对象:
- 传入
[{"name": "A"}, {"name": "B"}]—— 列表遍历 - 传入
map(lambda x: {"name": x}, names)—— 生成器延迟计算 - 传入自定义类,只要它有
__next__,就可被for消费
无需类型检查,也不用继承某个基类,只要“能走、能叫”,就可纳入流程。
运算符与内置函数的隐式多态
直接利用 Python 已有的多态能力,减少重复抽象:
- 用
len(data)统一获取长度:适用于 list、str、dict、set、自定义类(只要实现__len__) - 用
data[key]访问元素:list、dict、str、numpy array、pandas Series 都支持 - 用
sum(values)汇总数值:支持数字列表、生成器、甚至自定义数值容器(实现__add__和__radd__)
这些不是“技巧”,而是语言设计层面的多态契约,直接复用最安全高效。
通过抽象基类约束关键行为
当需要明确规范时,用 abc.ABC 定义最小接口,避免运行时报错:
- 声明
class DataProcessor(ABC): @abstractmethod def transform(self, item): pass - 不同清洗规则继承它:
CleanTextProcessor、NormalizeNumberProcessor - 主流程调用
processor.transform(row),无需 if-elif 判断类型
这样既保留鸭子类型的灵活性,又获得 IDE 提示和初始化校验。
不复杂但容易忽略:真正通用的算法,往往始于一个简单问题——“我到底依赖对象的什么能力?” 答案越具体(如“要能迭代”“要有 keys() 方法”),代码就越健壮、越易扩展。











