🧩 第六章 重用:OOP带来的软件重用和思想重用
📄 一句话概括

你写的类只要符合协议,标准库的代码就能接受它——实测自定义类未继承任何库类,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 秒实验

  1. 给你的类实现 __iter__,看能不能直接被 sorted/sum 吃进去。
  2. 试把【类/方法/接口】映射到你熟悉的某个非代码领域,看还指不指得出状态和行为。

常见误区

  1. 以为重用就是用别人的类。复用结构比复用代码更值钱。
  2. 以为结构同构就能套细节。岗位能被两个人顶,对象不行。
自测三问(点开对答案) 1. 结构化重用是什么? —— 不继承、只实现协议(如 __iter__/__len__),标准库的代码就认你——实测 for/sum/list 全能用。 2. 为什么这算重用? —— 复用的不是某段代码而是【迭代】这个结构的定义——约定成了最高形式的重用。 3. 搬到别的领域时边界在哪? —— 结构同构不等于细节相同:岗位能被两个人顶、对象不行;搬过去还能指出状态和行为在哪,才算真同构。

相关笔记