📄 一句话概括
包、异常、垃圾回收看着不相干,其实都在管同一件事:边界——命名边界、出错边界、生命周期边界。
📝 本节和前面几节的关系
4.10 收完三大要素,4.11~4.13 讲了语言细节,从这里开始讲三个后来的结构。
一、三个结构
包——管命名边界。没有它:类名撞车、谁都能看。 异常——管出错边界。没有它:错误码到处传、漏判。 垃圾回收——管生命周期边界。没有它:忘了释放、释放两次。 三句话里都有【边界】两个字,这不是巧合。
二、为什么排在三要素之后
它们是三要素跑起来之后才暴露的问题。 类一多,名字要分区(包);多态一多,失败路径要统一(异常);实例一多,谁负责销毁(回收)。 所以顺序不是随意的:先学会组织代码,才看得见组织之后的麻烦。
三、一个观察
Python 里这三样全是语言内置的:包=模块与 __init__.py,异常=try/except,回收=引用计数+分代。
所以你写代码时几乎不用想它们。
但读别人的框架代码时,必须先看懂它们——框架里到处是 import、try、上下文管理器。
四、这一节的用处
它是一张地图:告诉你 4.15~4.18 要讲的三个东西,各自在管哪条边界。 读后面三节时,每读一个就问一句:它没有的话,什么会乱? 这个问题问完,三个结构就记住了。
五、动手 Demo:更先进的 OOP 结构
三个结构,各管一条什么边界。 再想想没有它的时候,最先乱的是哪件事。
rows = [
("包", "命名边界", "类名撞车、谁都能看"),
("异常", "出错边界", "错误码到处传、漏判"),
("垃圾回收", "生命周期边界", "忘了释放、释放两次"),
]
for name, edge, bad in rows:
print(name, "管", edge, "|没有它:", bad)
实跑输出:
--------------------------------------------------------------------
更先进的 OOP 结构
--------------------------------------------------------------------
4.14~4.18 要讲三个后来的结构:**包、异常、垃圾回收。**
**它们看着不相干,其实都在管同一件事:边界。**
结构 管的边界 没有它会怎样
-------------------------------------------------
包 命名边界 类名撞车、谁都能看
异常 出错边界 错误码到处传、漏判
垃圾回收 生命周期边界 忘了释放、释放两次
**为什么这三个要放在【三大要素】之后讲?**
因为**它们是三大要素跑起来之后才暴露出来的问题**:
**类一多,名字要分区(包);多态一多,失败路径要统一(异常);实例一多,谁负责销毁(回收)。**
实测一个观察:Python 里这三样**全是语言内置的**——
包=模块与 `__init__.py`,异常=`try/except`,回收=引用计数+分代。
**所以你写代码时几乎不用想它们;**但**读别人的框架代码时,必须先看懂它们。**
实测这张表的关键词是边界:命名、出错、生命周期。 它们是三要素跑起来之后才暴露的问题——类多了要分区、多态多了要统一失败路径、实例多了要管生死。
30 秒实验
- 在你的项目里找一处【名字撞车】的地方,看包有没有帮上忙。
- 想一想:如果语言没有异常,你的错误处理会变成什么样。
常见误区
- 以为这三个结构是三要素的替代品。它们管的是另一条线:稳不稳。
- 以为内置就不用学。读框架代码必须先看懂它们。
自测三问(点开对答案)
1. 三个结构各管哪条边界? —— 包管命名边界、异常管出错边界、垃圾回收管生命周期边界。 2. 为什么它们排在三要素之后? —— 它们是三要素跑起来之后才暴露的问题:类多要分区、多态多要统一失败路径、实例多要管生死。 3. 内置就等于不用理解吗? —— 不等于。写代码时几乎不用想,但读框架代码时到处是 import、try、上下文管理器,看不懂就读不下去。- ☐ 下一节(4.15 进化的OOP结构之一:包)
相关笔记
- 进化的OOP结构之一:包 — 命名边界
- 对进化的 OOP结构的总结 — 三条边界的收口
- 对三大要素的总结 — 三要素管的是另一条线
- 🧩 面向对象是怎样工作的 · 索引