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

类是图纸/模具(一份),对象是照图纸造出的实例(无数个)——类定义结构,对象装真实数据。

📝 本节和前面几节的关系

七个观点走完,收尾两站补基本功。第一站:把【类】与【对象】两个词焊牢,不再混用。

一、类=图纸

类只写【有什么属性、有什么方法】,不装任何具体数据——Dog 类只有一份,躺在代码里。 2.2 读电路图时就是这种感觉:图纸上画着电阻电容的接法,但图纸上没有一颗真的电阻。 类定义结构,结构是【模板】不是【实物】。

二、对象=实例

实例化(new)照图纸造出具体个体,各自装各的数据——旺财、小黑、阿黄三只狗对象,name 各不相同。 硬件版的类比:图纸一张,按图焊出的机器一台台——每台都通电装着【当前值】。 对象才占内存、才参与运行;类只是占代码空间的设计说明。

三、两个词的使用纪律

说【类的属性】是在讲图纸栏目(狗都有名字),说【对象的属性】是在讲某只狗的具体值(旺财叫旺财)。 技术文献里两词常被混着写——读到时用【图纸还是实物】这一问自辨。 7.9 的三大特性都定义在类上(图纸规定藏什么、传什么、怎么应答),却实现在每个对象上。

四、动手 Demo:图纸与产品

一张 Dog 图纸造三只狗,验证:图纸一份、对象多只、身份各异。

class Dog:
    def __init__(self, name):
        self.name = name
    def speak(self): return "汪汪"
dogs = [Dog("旺财"), Dog("小黑"), Dog("阿黄")]
for d in dogs:
    print(d.name, d.speak())
print("对象数", len(dogs))
print("身份各异", len(set(map(id, dogs))) == 3)

实跑输出:

--------------------------------------------------------------------
类和对象的区别——图纸与产品
--------------------------------------------------------------------

类是图纸(只有一份), 对象是照图纸造出的产品(可以有无数个):

    旺财.speak() -> 汪汪
    小黑.speak() -> 汪汪
    阿黄.speak() -> 汪汪

    图纸(Dog 类)有几张? 1 张
    照图纸造出的对象有几只? 3 只
    三只狗的身份号各不相同? True

  概念     是什么                 数量     例子
  --------------------------------------------------------
  类       图纸: 写属性和方法     1 份     Dog 类定义
  对象     实例: 装具体数据       无数     旺财/小黑/阿黄

类只写【有什么】, 对象才装【具体值】——两个词从此不再混。

id() 各不相同说明三只狗是三个独立的内存对象——图纸一份,产品各占各的格子。 6.1 的【变量=格子】在这里续上了:对象的属性就是一组归它管的格子。

30 秒实验

  1. 说一说:Dog 类的 speak 方法有几份?旺财对象的 name 有几份?
  2. 在 Python 里连续实例化两个对象,用 id() 验证它们身份不同。

常见误区

  1. 以为类和对象是一回事的两种叫法——图纸与实物,数量与职责都不同。
  2. 以为类也占运行内存——运行时占内存的是对象,类只是设计说明。
自测三问(点开对答案) 1. 类和对象各是什么? —— 类是图纸/模具,对象是照图造出的实例。 2. 一张图纸能造几个对象? —— 无数个——每个对象装各自的数据。 3. 硬件里跟【图纸与实物】对应的类比? —— 电路图与按图焊出的机器——图一张,机器多台。

相关笔记