为什么需要类 —— 从字典的痛点讲起
普通课约 50 分钟
本课导读
新单元不着急学语法,先回答一个更重要的问题:字典用得好好的,为什么还要发明"类"? 本课带你亲身踩一遍用字典建模的三个痛点,再看类(class)怎么一次治好它们。学完你会突然发现:其实从第一天写 "abc".upper() 起,你就一直在用类的产物。预计 50 分钟。
用字典养一只"任务"
假设你在给自己搭个待办工具(阶段 0 项目课的既视感来了)。每条任务有标题、优先级、是否完成——字典建模,熟练:
能跑,也不难看。但任务一多、功能一加,三个痛点就会按时上门。
痛点一:拼错键,没人拦你
还记得"赋值即创建"吗?它在这里成了帮凶:拼错的键不报错,而是静默创建一个新键。这种 bug 不炸不响,直到某天统计数字对不上,你才开始大海捞针。
痛点二:数据和它的操作是散的
finish()、describe() 和 task 字典逻辑上是一家人,代码上却是陌生人——函数散落在各处,谁都能对字典下手,每次调用还得把字典传来传去。项目一大,"哪些函数是伺候这个数据的"全靠记忆。
痛点三:每造一个都要手抄结构
没有模板,每次创建全凭自觉——字段漏没漏、默认值给没给,出了事还是延迟才炸(KeyError 在使用时才出现,不在创建时)。
类:一次治好三个痛
同一个"任务",用类重写。先看效果再拆语法(下一课细讲,今天混脸熟):
对着三个痛点验收:
- 模板化创建:
Task("写周报")按图纸生产,字段齐全、默认值自动带上——痛点三没了 - 数据和操作住一起:
finish、describe就长在 Task 身上,t1.finish()直接喊,不用传来传去——痛点二没了 - 拼错就报错:试试把上面的
t1.done改成t1.donee再读——AttributeError,当场抓获,不再静默——痛点一大半也没了
提示
类比记忆:类是模具,对象是产品。Task 这个类是"任务"的模具(规定了有什么属性、会什么动作);t1、t2 是模具压出来的两个产品,各有各的数据,但能力一样。造一百个任务也不怕漏字段——模具保证了出厂配置。
惊天真相:你从第一天就在用对象
现在揭一个盖子。回忆这些你写过无数遍的代码:
.strip()、.append()、.get()——这个"点一下、喊方法"的姿势,正是对象的用法。字符串、列表、字典本身就是 Python 内置的类,你写 "abc" 时就是在造一个 str 类的对象。所以"面向对象"对你根本不是新事物,只是今天开始,模具从"别人造好的"变成"你也能造"。
说明
为什么转行 AI 的人要学类?两个实用理由:① 你将来用的一切库——pandas 的 DataFrame、PyTorch 的模型——全是类,看懂类才能看懂文档和示例;② 不用你写很多类,但读懂别人的类是刚需,这正是本单元最后两课的主题。目标是"够用":会造简单模具、能读懂复杂模具,不深挖屠龙技。
✍️ 练习
练习 1:痛点侦探
下面的字典版代码埋了一个"静默 bug"——运行后统计数字是错的,但程序不报错。找出它,并说明这个 bug 在类版本里会变成什么。
✅ 参考答案
"paied" 拼错了——字典的"赋值即创建"静默造出一个新键,第二单的 paid 依然是 False,统计输出 1。若是类的对象,order.paied = True 虽然也能创建属性,但读取 order.paid 前后逻辑集中在类里、字段有模板兜底,而且规范写法下(属性在 __init__ 统一声明)拼错会在 review 和使用中更早暴露;下一课还会看到更严格的防拼错手段。核心教训:结构无模板,错误就延迟爆炸。
练习 2:模具质检
运行下面的类版本代码前,先预测输出的三行各是什么,再运行验证。
✅ 参考答案
《小王子》读到 48/96 页、《活着》读到 0/100 页、100。要点:b1 和 b2 是两个独立产品——b1 翻页不影响 b2;b2 没传 pages,用了模具里的默认值 100。
练习 3:改写初体验(挑战)
把这段字典 + 函数的代码改写成类(模仿本课 Task 的样子):会员有 name 和 points(默认 0),add_points 加积分,level 返回等级(积分 ≥ 100 是 "金卡",否则 "普卡")。
💡 提示
骨架:class Member: → def __init__(self, name, points=0): 把两个字段挂到 self 上 → 两个方法第一个参数都是 self,函数体里把 m["xxx"] 全换成 self.xxx。
✅ 参考答案
class Member:
def __init__(self, name, points=0):
self.name = name
self.points = points
def add_points(self, n):
self.points = self.points + n
def level(self):
return "金卡" if self.points >= 100 else "普卡"
m = Member("小雨")
m.add_points(120)
print(f"{m.name}:{m.level()}")
对照一下:数据(name/points)和动作(add_points/level)从"散装"变成了"住在一个屋檐下"。self 具体是什么,下一课正面讲透。
📝 随堂测验
1. 用字典建模的“静默 bug”指的是?
2. “类”和“对象”的关系,最贴切的类比是?
3. 类相比“字典 + 散装函数”,解决了哪个组织问题?
4. nums.append(4) 这个写法说明了什么?
5. 转行 AI 的学习者学类的首要目标是?
本课小结
- 字典建模三痛:拼错键静默出 bug、数据和函数散装、创建无模板漏字段
- 类 = 模具,对象 = 产品:模板化创建 + 数据行为同住 + 错误更早暴露
- 你早就在用对象:str/list/dict 都是内置类,"点方法"就是对象的用法
- 学习目标"够用即可":造得出简单的,读得懂复杂的
下一课正面拆解类的语法:__init__ 是什么、self 到底是谁、属性和方法怎么写——把今天混的脸熟变成真会。
划选正文任意文字可高亮、批注或加入复习卡
讨论
载入中…