这套课程按知识依赖排列。本篇的前置知识是:第 35 篇。学完后,你应该能够区分拥有关系和属于关系。
本篇要解决的问题
本篇只处理“封装、组合与继承怎样选择”这一件事。示例基于 Python 3.14.6,在 macOS 环境核验;除明确标注的终端命令外,代码本身只使用 Python 标准能力。
先看清一个容易误解的细节
组合表达“一个对象拥有另一个对象”,继承表达“子类属于父类的一种”。复用代码不是使用继承的充分理由。
核心概念
- 封装让对象通过方法维护自己的有效状态。
- 组合通常更灵活:外部对象只依赖协作对象提供的行为。
- 继承适合稳定的“是一种”关系,并且子类应能替代父类。
跟着示例运行
把下面代码保存到本课脚本并运行:
class Storage:
def save(self, text):
print("保存:", text)
class LearningService:
def __init__(self, storage):
self.storage = storage
def finish_lesson(self, title):
self.storage.save(title)
service = LearningService(Storage())
service.finish_lesson("异常处理")
预期结果:
保存: 异常处理
输出中包含环境路径、集合元素或日志格式时,具体文字和顺序可能随本机环境变化;判断是否成功应以本篇说明的关键结果为准。
按执行顺序拆开看
LearningService不负责具体保存细节,只保存一个实现save()的协作对象。- 调用业务方法时,服务把保存动作委托给
Storage;替换存储实现不要求改变课程完成逻辑。
初学者容易混淆的地方
- 为了复用一两个方法就建立不符合“是一种”关系的继承层次。
- 把组合理解为简单嵌套数据;关键在于对象通过清晰接口协作。
练习
- 用组合让
OrderService使用一个Notifier。 - 为“学生属于用户”设计简单继承,再说明它成立的前提。
练习应先独立完成,再通过增加 print 输出或检查文件内容观察中间状态。当前课程尚未讲到的能力,不要求提前搜索复杂写法。
本篇边界
本篇目标是区分拥有关系和属于关系。没有展开的高级机制会放到后续课程;先确保能够解释示例中每一行代码,再进入下一篇。
相关文章
01|Python 程序从源码到输出经历了什么
面向按顺序学习 Python 的初学者,本篇在零基础上,帮助读者理解源代码、解释器和输出之间的关系。
02|在 macOS 安装并确认 Python 3 环境
面向按顺序学习 Python 的初学者,本篇在第 01 篇知识上,帮助读者在 macOS 中确认 Python 3.14 和 pip 是否可用。
03|交互式解释器和 Python 脚本怎么选择
面向按顺序学习 Python 的初学者,本篇在第 02 篇知识上,帮助读者根据任务选择 REPL 或 `.py` 脚本。
04|建立第一个 Python 项目目录
面向按顺序学习 Python 的初学者,本篇在第 03 篇知识上,帮助读者理解当前目录并正确运行项目脚本。

