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

三要素各管一类重复,合起来正好覆盖 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 秒实验

  1. 把三要素和三张痛各写在一张卡片上,打乱配对,看你能不能连回去。
  2. 在你的代码里找一个同时用到三要素的地方。

常见误区

  1. 以为三要素是三个独立的技术。它们是三条治同一种病的药。
  2. 以为学完三要素就学完 OOP 了。系统跑起来还有三个结构。
自测三问(点开对答案) 1. 三要素各消掉哪种重复? —— 类消数据在函数间传来传去;多态消调用方反复判断类型;继承消多个类里的相同代码。 2. 综合例子里四件事怎么体现? —— 类把数据和 area 放一起、隐藏让 _name 只能经 name() 取、多态一句 s.area() 通吃、继承让 _name 只写一遍;实测 16.0+9.0=25.0。 3. 三要素之外还缺什么? —— 保证系统跑得稳的三件事:包(名字)、异常(失败)、垃圾回收(对象生死)。

相关笔记