📄 一句话概括
三种复用单位各能带走什么——函数带算法、类带算法+数据+规则、框架带骨架,实测抄写量从 12 行降到 4 行。
📝 本节和前面几节的关系
第五章讲完内存,这一章换话题:这些结构让代码能被重复用了。
一、三种复用单位
函数:带走算法,带不走要的数据——每次调用还得把数据递进去。 类:带走算法+数据+规则,自己带着,几乎不用改。 框架:带走骨架+流程,只留几个洞让你填。 关键差别在中间那一行:类凭什么比函数多带一样东西?因为类有实例变量。
二、实测抄写量
三个类各写一遍同样的初始化(3 个字段+1 次校验):复制版 12 行。
提到一个父类里写一遍:继承版 4 行。
少抄 8 行,而且改的时候只改一处。
三个子类各写一句 pass——共 3 行,一行逻辑都没有。
三、为什么说【OOP 的结构】促进重用
因为继承和组合让【数据和规则】能被整体搬走,而函数只能搬算法。 这就是 4.4 讲的【汇总】在重用上的回报:先装进盒子,盒子才能被复制。 反过来看:一个只会写函数的人,想复用就得连全局变量一起搬——搬不动,只好复制。
四、这一章的路线
6.2~6.4 讲类库:一堆写好的类,以及所有类的祖先。 6.5~6.8 讲框架与组件:半成品,和能单独换掉的构件。 6.9~6.12 讲设计模式与思想重用:从【复用代码】走到【复用想法】。
五、动手 Demo:OOP 的优秀结构能够促进重用
三种复用单位各能带走什么。 再用实测数据看复制和继承的抄写量差多少。
# 复制版:三个类各写一遍同样的初始化(3 字段 + 1 校验)
# 继承版:提到 Base 里写一遍,三个子类各写一句 pass
class Base:
def __init__(self, name, level, rate):
self.name = name
self.level = level
self.rate = rate
if rate < 0:
raise ValueError("rate 不能为负")
class A(Base): pass
class B(Base): pass
class C(Base): pass
实跑输出:
--------------------------------------------------------------------
OOP 的优秀结构能够促进重用
--------------------------------------------------------------------
三种复用单位,**各自能带走什么**,这是本章的地基:
单位 能带走 带不走的 复用时要改
----------------------------------------------------------------
函数 算法 要的数据 参数得重新传
类 算法+数据+规则 没有(自己带着) 基本不用改
框架 骨架+流程 具体业务 只填空
实测【复制 vs 继承】的抄写量——三个类各写一遍同样的初始化:
复制版:三个类各抄一遍 12 行
继承版:只写一遍 4 行
少抄 8 行
三个子类各写一句 pass 共 3 行
**注意带不走的那一列**:函数复用的是【算法】,**数据还得每次递进去。**
**类之所以能带走三样,是因为它自己有实例变量。**
**这就是 4.4 讲的【汇总】在重用上的回报。**
实测:复制版 12 行、继承版 4 行,少抄 8 行,三个子类各一句 pass。 注意函数带不走数据——类能带走三样,是因为它自己有实例变量,这是【汇总】的回报。
30 秒实验
- 找一段被你复制过两次以上的初始化代码,试着提成父类。
- 列一张表:你项目里的复用单位,各自能带走什么、带不走什么。
常见误区
- 以为函数复用就等于代码复用。数据带不走,复用就不完整。
- 以为继承只为少写字。它是为了只留一个能改的地方。
自测三问(点开对答案)
1. 三种复用单位各能带走什么? —— 函数带算法;类带算法+数据+规则;框架带骨架+流程。 2. 复制版和继承版的实测差多少? —— 复制 12 行、继承 4 行,少抄 8 行;三个子类各一句 pass。 3. 类凭什么比函数多带一样东西? —— 因为类有实例变量,数据跟着它一起被复制、传递、复用;函数每次都要别人把数据递进来。- ☐ 下一节(6.2 类库是OOP的软件构件群)
相关笔记
- 类库是OOP的软件构件群 — 现成的类在哪
- 类的功能之一:汇总 — 汇总在重用上的回报
- 进化方向演变为重视可维护性和可重用性 — 这个方向从哪来
- 🧩 面向对象是怎样工作的 · 索引