Python面向对象可扩展性的核心是职责分离、接口抽象和松耦合。通过ABC定义稳定契约、策略模式替代分支、组合代替继承、预留钩子与事件机制,实现“插得进、改得少、不影响旧逻辑”。

Python面向对象设计的可扩展性,核心在于让新功能能自然“插得进、改得少、不影响旧逻辑”。不是堆砌设计模式,而是通过职责分离、接口抽象和松耦合来支撑后续迭代。
用抽象基类(ABC)定义稳定契约
当一组类预期会新增多种实现时,提前定义抽象基类,明确哪些方法必须实现、哪些可以默认。这样新增子类只需关注业务差异,不破坏已有调用方代码。
- 避免直接依赖具体类,改为依赖 ABC 或 Protocol;调用方只认接口,不关心背后是 FileLogger 还是 KafkaLogger
- 抽象方法用 @abstractmethod 标记,非强制但能提前暴露设计意图;可选行为用普通方法 + 文档说明“建议重写”
- 例如日志模块:定义 Logger ABC,含 log(level, msg) 抽象方法;后续加数据库日志、云服务日志,都只需继承并实现该方法
策略模式替代硬编码分支
遇到 if/elif 判断不同行为(如支付方式、解析格式、通知渠道),别在主流程里不断加 else,把每种行为封装成独立策略类,运行时按需注入。
- 主逻辑只持有一个策略对象,调用统一接口(如 execute()),新增策略无需修改原有类
- 策略类之间无继承关系,靠组合+依赖注入解耦;可通过工厂或配置动态选择策略实例
- 例如报表导出:ExcelExporter、PdfExporter、CsvExporter 都实现 Exporter 接口;上层 ReportGenerator 只需接收一个 exporter 实例,不感知具体类型
用组合代替深层继承,保留扩展弹性
多层继承(A → B → C → D)看似复用,实则导致修改一处牵连全局,且难以混合复用不同能力。优先用“有”而非“是”的关系。
媒体包提供了可管理各种媒体类型的类。这些类可提供用于执行音频和视频操作。除了基本操作之外,还可提供铃声管理、脸部识别以及音频路由控制。本文说明了音频和视频操作。 本文旨在针对希望简单了解Android编程的初学者而设计。本文将指导你逐步开发使用媒体(音频和视频)的应用程序。本文假定你已安装了可开发应用程序的Android和必要的工具,同时还假定你已熟悉Java或掌握面向对象的编程概念。感兴趣的朋友可以过来看看
- 把可变行为拆为独立组件(如 Validator、Formatter、RetryPolicy),主类通过属性持有它们,运行时可替换或叠加
- 组件间通过明确输入输出交互,不隐式依赖父类状态;比如 OrderProcessor 持有 payment_validator 和 inventory_checker,各自独立测试和升级
- 未来要支持新校验规则?加个新 Validator 类,传给 OrderProcessor 即可,不用动继承链
预留钩子(Hook)与事件机制
预判可能被定制的环节(如“创建后”、“保存前”、“失败时”),主动留出可覆盖的方法或发布事件,让扩展者在不侵入原逻辑的前提下插入自定义行为。
- 在关键节点定义空的 hook 方法(如 on_save_complete()),子类按需重写;或使用观察者模式,注册监听器响应事件
- 钩子命名清晰、文档注明触发时机和参数约束;避免在 hook 中强依赖内部私有属性
- 例如用户注册流程:User.create() 内部调用 self._on_user_created(),第三方模块可继承 User 并重写该方法发送欢迎邮件、同步到 CRM 等
可扩展不是一步到位的设计,而是每次修改时多问一句:“如果下周要加一种新类型/新规则/新渠道,我现在的代码要改几处?”答案越少,结构越健康。









