📄 一句话概括
三要素各管一类重复,合起来正好覆盖 4.1 那三条——正方形 16.0 + 三角形 9.0 = 25.0。
📝 本节和前面几节的关系
4.4~4.9 逐条讲完,这一节把三条并成一张表。
一、一张表
类——数据在函数间传来传去——汇总+隐藏。 多态——调用方反复判断类型——同一句调用。 继承——多个类里有相同代码——提到父类。 左边是痛,中间是重复,右边是动作。记住这个三段式,比背三个名词有用。
二、一个综合例子
Shape 里写 _name 和 name(),Square 和 Tri 各写自己的 area()。
四件事同时在场:类(数据和方法在一起)、隐藏(_name 只能经 name())、多态(一句 s.area() 通吃)、继承(_name 只写一遍)。
实测:正方形 16.0 + 三角形 9.0 = 25.0。
三、为什么值得背
后面 5~11 章讲的框架、模式、设计,说到底都是在处理这三件事的排列组合。 第 6 章的重用=类与继承的组合;第 8 章的 UML=把这三件事画出来;第 10 章的设计=把职责分到这三件事上。 所以这张表不是本章小结,是后面六章的目录表。
四、三要素之外还剩什么
三大要素保证代码组织得好,不保证系统跑得稳。 跑起来之后才暴露的三件事:名字撞车、失败路径、对象生死。 那就是 4.14 起的包、异常、垃圾回收。
五、动手 Demo:对三大要素的总结
把三要素和 4.1 那三种重复对上。 再用一个例子让三种要素同时在场。
class Shape:
def __init__(self, name): self._name = name
def name(self): return self._name
class Square(Shape):
def __init__(self, a):
Shape.__init__(self, "正方形"); self.a = a
def area(self): return self.a * self.a
class Tri(Shape):
def __init__(self, b, h):
Shape.__init__(self, "三角形"); self.b, self.h = b, h
def area(self): return self.b * self.h / 2.0
ss = [Square(4), Tri(6, 3)]
print(sum(x.area() for x in ss))
实跑输出:
--------------------------------------------------------------------
对三大要素的总结
--------------------------------------------------------------------
三大要素各管一件事,**合起来正好覆盖 4.1 说的三种重复。**
要素 消掉的重复 关键动作
---------------------------------------------
类 数据在函数间传来传去 汇总+隐藏
多态 调用方反复判断类型 同一句调用
继承 多个类里有相同代码 提到父类
实测一个综合例子——三种要素同时在场:
类: 数据 a/b/h 和方法 area 待在一起
隐藏: _name 只能通过 name() 取
多态: total 里一句 s.area() 通吃
继承: _name 和 name() 只在 Shape 写一遍
实测:正方形 16.0 + 三角形 9.0 = **25.0**
**这张表建议背下来。**后面 5~11 章讲的框架、模式、设计,
**说到底都是在处理这三件事的排列组合。**
实测:正方形 16.0 + 三角形 9.0 = 25.0,四种要素同时在代码里出现。 这张表建议背下来——后面五到十一章,说到底都是这三件事的排列组合。
30 秒实验
- 把三要素和三张痛各写在一张卡片上,打乱配对,看你能不能连回去。
- 在你的代码里找一个同时用到三要素的地方。
常见误区
- 以为三要素是三个独立的技术。它们是三条治同一种病的药。
- 以为学完三要素就学完 OOP 了。系统跑起来还有三个结构。
自测三问(点开对答案)
1. 三要素各消掉哪种重复? —— 类消数据在函数间传来传去;多态消调用方反复判断类型;继承消多个类里的相同代码。 2. 综合例子里四件事怎么体现? —— 类把数据和 area 放一起、隐藏让 _name 只能经 name() 取、多态一句 s.area() 通吃、继承让 _name 只写一遍;实测 16.0+9.0=25.0。 3. 三要素之外还缺什么? —— 保证系统跑得稳的三件事:包(名字)、异常(失败)、垃圾回收(对象生死)。- ☐ 下一节(4.11 通过嵌入类型使程序员的工作变轻松)
相关笔记
- OOP具有结构化语言所没有的三种结构 — 这一章的开头
- 更先进的OOP结构 — 三要素之外的三件事
- 与现实世界的相似增大了可能性 — 为什么这三件事够用
- 🧩 面向对象是怎样工作的 · 索引