🧩 第四章 面向对象编程技术:去除冗余、进行整理
📄 一句话概括

包、异常、垃圾回收看着不相干,其实都在管同一件事:边界——命名边界、出错边界、生命周期边界。

📝 本节和前面几节的关系

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. 想一想:如果语言没有异常,你的错误处理会变成什么样。

常见误区

  1. 以为这三个结构是三要素的替代品。它们管的是另一条线:稳不稳。
  2. 以为内置就不用学。读框架代码必须先看懂它们。
自测三问(点开对答案) 1. 三个结构各管哪条边界? —— 包管命名边界、异常管出错边界、垃圾回收管生命周期边界。 2. 为什么它们排在三要素之后? —— 它们是三要素跑起来之后才暴露的问题:类多要分区、多态多要统一失败路径、实例多要管生死。 3. 内置就等于不用理解吗? —— 不等于。写代码时几乎不用想,但读框架代码时到处是 import、try、上下文管理器,看不懂就读不下去。

相关笔记