💻 第七章 成为会使用面向对象编程的程序员吧
📄 一句话概括

观点 7:OOP 三大特性——封装藏内部、继承传家产、多态一声令下多种响应;三者合起来是 OOP 的技术核心。

📝 本节和前面几节的关系

前六个观点是世界观,本节是技术核心——三个词把 OOP 的本领说尽,也是全章难度最高的一站。

一、封装:藏起来

封装=数据与操作打包,内部细节对外隐藏,只留公开方法进出。 好处两条:防误用(外人碰不到内脏)、可维护(内脏随便换,接口不变则天下太平)。 7.4 的可维护性红利,机制来源就是它——封装是三大特性里的地基。

二、继承:传下去

继承=子类自动获得父类的属性和方法,再加自己的新本事。 狗是动物、猫也是动物——Animal 放公共的 name 和 eat(),Dog、Cat 各自扩展,公共代码只写一遍。 继承表达【是一种】的关系,也是代码复用的家族通道(7.11 的用法 3 会再回到它)。

三、多态:一声令下,各有各应

多态=同一个命令,不同对象有不同响应:对一群动物喊 speak(),狗回汪汪、猫回喵喵。 调用方只管下令,不必逐个辨认【你是谁】——新添一种动物,调用代码一行不改。 【⚠️ 2026 现状】工程界警语【组合优于继承】:继承层次过深反而难维护,该用组合时就用组合——三大特性之外记得带刹车。

四、动手 Demo:继承、封装、多态一锅端

Animal 基类传家产,Dog/Cat 各自重写叫声,双下划线属性演示封装拦截。

class Animal:
    def __init__(self, name):
        self.name = name
        self.__heart = "跳动中"
    def speak(self): return "..."
class Dog(Animal):
    def speak(self): return "汪汪"
class Cat(Animal):
    def speak(self): return "喵喵"
for a in [Dog("旺财"), Cat("咪咪")]:
    print(a.name, a.speak())
print(Dog("旺财").__heart)

实跑输出:

--------------------------------------------------------------------
观点 7——继承、封装和多态
--------------------------------------------------------------------

三大特性是 OOP 的技术核心, 一个例子全演示:

    旺财.speak() -> 汪汪
    咪咪.speak() -> 喵喵

    想直接摸旺财的心脏 -> 报错 AttributeError! (封装拦下)

  特性     一句话                     本例中的体现
  -------------------------------------------------------------
  封装     内部细节对外藏             __heart 只能经方法访问
  继承     子类自动获得父类家产       Dog/Cat 白得 name 属性
  多态     同一命令, 各有各的响应     speak() 一个调用两种叫声

【⚠️ 2026 现状】工程界有句警语: 组合优于继承——继承层次太深
反而难维护; 三大特性之外, 也要记住这条刹车。

同一个 speak() 调用,两种叫声——多态让调用方只对接口说话,不对具体类说话。 最后一行直接摸心脏会报 AttributeError——封装把内部藏住了;Python 的私有只是约定,强行动它就走后门,Java 的 private 则是硬拦。

30 秒实验

  1. 给动物家族添一个 Bird 类,只写新增部分,验证继承的省力。
  2. 故意访问一次 __heart,读一遍报错信息,体会封装的拦截。

常见误区

  1. 以为继承越多越好——层次过深是维护噩梦,警语是组合优于继承。
  2. 以为多态很玄——它就是【同一接口、多种实现】,重写方法即是最常见的形式。
自测三问(点开对答案) 1. 三大特性各自一句话? —— 封装藏内部、继承传家产、多态一声令下多种响应。 2. 7.4 的可维护性红利的机制来源是哪个特性? —— 封装——改动被关在类内部。 3. 工程界对继承的警语是什么? —— 组合优于继承——该用 has-a 时别硬上 is-a。

相关笔记