📄 一句话概括
你写的类只要符合协议,标准库的代码就能接受它——实测自定义类未继承任何库类,for/sum/list 全能用。
📝 本节和前面几节的关系
6.10 讲模式帮你读代码,这一节讲这套结构还能搬到代码以外。
一、思想重用比代码重用更大
代码重用是【用别人的类】,思想重用是【用别人的结构】。
实测最直接的一条:你写的类只要符合协议,就能被标准库的代码接受——这叫结构化重用。
自定义 MyBox 实现了 __iter__ 和 __len__,没继承任何库类,实测它是 Iterable、是 Sized,for/sum/list 全都能用。
二、为什么这算重用
因为你复用的不是某段代码,是【迭代】这个结构的定义。
标准库的 sum 从不认识你的类,但它认 Iterable 这个结构。
所以重用的最高形式是【约定】:大家守同一个结构,彼此的代码就能拼。
三、搬到代码以外
同一个结构换个名字,在别的领域也成立:类→岗位、方法→职责、接口→对接人。 这不是打比方,是结构真的同构——所以第七章讲【面向对象化为通用的归纳整理法】。 这也是 2.6 那个警告的另一面:比喻会掩盖细节,但结构同构是真的有用。
四、边界
结构同构不等于细节相同:岗位可以被两个人顶,对象不行。 所以借结构可以,套细节不行。 判断办法:搬过去之后,还能不能指出【状态在哪、行为在哪】?能,就是真同构。
五、动手 Demo:扩展到各个领域的思想的重用
写一个不继承任何库类的容器,只实现两个特殊方法。 看标准库的代码认不认它。
import collections.abc as abc
class MyBox:
def __init__(self, items):
self._items = list(items)
def __iter__(self):
return iter(self._items)
def __len__(self):
return len(self._items)
box = MyBox([1, 2, 3])
print(isinstance(box, abc.Iterable), isinstance(box, abc.Sized))
print(sum(box), list(box))
实跑输出:
--------------------------------------------------------------------
扩展到各个领域的思想的重用
--------------------------------------------------------------------
【思想重用】比【代码重用】更大:**同一套结构可以搬到别的领域。**
实测最直接的一条——**你写的类只要符合协议,就能被标准库的代码接受:**
MyBox 是自己写的类,没继承任何标准库的类
它是 Iterable 吗 True
它是 Sized 吗 True
for 循环能用吗 [1, 2, 3]
sum() 能用吗 6
list() 能用吗 [1, 2, 3]
再看【搬到别的领域】这件事,同一个结构换个名字就成立:
代码里的 搬到组织里 搬到图纸上
---------------------------------------------
类 岗位 图框里的一个部件
方法 职责 这个部件的动作
接口 对接人 接口标注
**所以【思想重用】不是比喻,是结构真的同构**——**这也是第七章的正题。**
**而 6.11 想说的是:学会了这套结构,你的收获不止在代码里。**
实测:没继承任何库类,isinstance 判定为 Iterable/Sized,for/sum/list 全能用。
这就是结构化重用:复用的不是代码,是【迭代】这个结构的定义——最高形式的重用是约定。
30 秒实验
- 给你的类实现
__iter__,看能不能直接被sorted/sum吃进去。 - 试把【类/方法/接口】映射到你熟悉的某个非代码领域,看还指不指得出状态和行为。
常见误区
- 以为重用就是用别人的类。复用结构比复用代码更值钱。
- 以为结构同构就能套细节。岗位能被两个人顶,对象不行。
自测三问(点开对答案)
1. 结构化重用是什么? —— 不继承、只实现协议(如 __iter__/__len__),标准库的代码就认你——实测 for/sum/list 全能用。 2. 为什么这算重用? —— 复用的不是某段代码而是【迭代】这个结构的定义——约定成了最高形式的重用。 3. 搬到别的领域时边界在哪? —— 结构同构不等于细节相同:岗位能被两个人顶、对象不行;搬过去还能指出状态和行为在哪,才算真同构。- ☐ 下一节(6.12 通过类库和模式发现的重用的好处)
相关笔记
- 面向对象和现实世界是似是而非的 — 比喻的另一面
- 设计模式是类库探险的路标 — 协议从哪认出来
- ⌨️ 编程原理 · 索引 — 抽象与协议
- 🧩 面向对象是怎样工作的 · 索引