📄 一句话概括
面向对象编程(OOP)把【数据+操作】打包成对象,程序从【指令的罗列】升级为【对象的集合】——当今的主流开发方法。
📝 本节和前面几节的关系
第六章末尾留了一句话:类=结构体+方法。本章就把这句话展开成完整的 OOP 世界观,先从总体说起。
一、从结构体到对象
6.6 讲过:结构体把姓名、学号、分数这类异类数据打包成一个单位。 OOP 再往前一步:把【操作这些数据的函数】也一起打包——数据+方法装进同一个壳,这个壳就叫对象。 对象对自己的一亩三分地全权负责:外部想动它的数据,得走它公开的方法——计数器只暴露加一和读取,格子里怎么存外人管不着。
二、OOP 的时代位置
1980 年代 Smalltalk、C++ 把 OOP 带进工业界;1995 年 Java 问世,把 OOP 推成全民标配;如今主流语言几乎都支持。 为什么能流行?程序规模爆炸。第二章的微型计算机程序几十行,现代软件动辄百万行——组织代码的方式必须跟着升级,OOP 就是那次升级。 【⚠️ 2026 现状】面向对象已不是唯一的流行范式,Python、Go、Rust 各有取舍,但【把数据与操作打包、按接口协作】的思想早已渗进所有主流语言。
三、本章怎么展开
教材给出七个观点,外加两站收尾(类和对象的区别、类的三种使用方法)。 七个观点像盲人摸象:拼装、效率、大型开发、建模、UML、消息、三大特性——每个只摸到 OOP 的一面。 下一节先把整张地图铺开,然后一站一站细看。
四、动手 Demo:把数据与操作打包成对象
写一个计数器类,把【计数格数+加一+读取】打包,再开两个对象验证互不干扰。
# 类: 数据(属性) + 操作(方法) 打包
class Counter:
def __init__(self):
self.count = 0
def inc(self):
self.count = self.count + 1
def get(self):
return self.count
c1 = Counter(); c2 = Counter()
for _ in range(3): c1.inc()
c2.inc()
print(c1.get(), c2.get())
实跑输出:
--------------------------------------------------------------------
面向对象编程——把数据与操作打包成对象
--------------------------------------------------------------------
从第三章到第六章,程序里的数据和操作越堆越多。面向对象编程(OOP)
的主意是:**把相关的数据和操作打包成一个对象**, 各管各的。
用一个计数器类打包【计数格数 + 加一 + 读取】三个家伙:
c1 加了 3 次, c2 加了 1 次, 两个对象互不干扰:
c1.get() = 3, c2.get() = 1
对象 自己的 count 说明
------------------------------------------------------
c1 3 自己加了 3 次
c2 1 自己加了 1 次, 不受 c1 影响
数据(属性)和操作(方法)装在同一个对象里——这就是 OOP 的最小样本。
第六章的结构体只打包了数据, 类再往前一步, 把操作也打包进来。
c1、c2 各有各的 count 格子——打包的第一个红利:数据不再散落全局,各归各主。 第六章的结构体只有【数据+】,类是【数据+操作】——本章的故事全部从这个加号开始。
30 秒实验
- 把 6.6 的学生结构体改写成类:哪些函数该打包进去?(加分、算平均、显示……)
- 在 Python 里建两个 Counter,验证改一个不影响另一个。
常见误区
- 以为 OOP 只是【换种语法写代码】——它换的是组织代码的思路:从指令流水到对象协作。
- 以为对象就是结构体换名字——结构体只打包数据,对象连操作一起打包并管住访问。
自测三问(点开对答案)
1. OOP 打包的是哪两样东西? —— 数据和操作(属性+方法),打包成对象。 2. 两个同类对象的数据互不干扰,为什么? —— 每个对象有自己的属性格子,数据各归各主。 3. 本章的展开路线? —— 七个观点逐站细看,外加类和对象、三种用法两站收尾。- ☐ 下一节(7.2 对OOP的多种理解方法)
相关笔记
- 要点6:了解结构体的组成 — 结构体是类的前身
- ⌨️ 编程原理 · 索引 — 程序组织方式的进化史在那边成体系
- 💻 计算机是怎样跑起来的 · 索引