Python 的类与对象系统底层是如何实现的?CS61A Composing Programs 中文教程带你一次搞懂
【免费下载链接】composing-programs-zh🦊 CS61A 教材 Composing Programs 的中文翻译项目地址: https://gitcode.com/gh_mirrors/co/composing-programs-zh
composing-programs-zh是伯克利大学 CS61A 经典教材《Composing Programs》(《构造程序要素》,SICP 的 Python 版本)的中文翻译项目。它不仅是一份中文文档,更是一本带你从"使用 Python 的人"转变为"语言设计者"的深度教程——尤其是其中"用纯函数和字典重新实现类与对象"的章节,是理解 Python 对象系统底层原理的最佳材料。
🧱 一、类与对象系统是什么:模板与实例的关系
很多新手写 Python 时天天用class,却说不出对象到底是什么。教材的表述非常直白:
类就像一个模板,对象是按照模板(类)生成的实例。
- 类(class):定义了一组对象之间共享的属性和方法
- 对象(object):类的一次"实例化",拥有自己的属性值
- 属性:与对象关联的名称-值对,通过点表达式(
account.balance)访问
例如银行账户Account类允许创建多个账户实例,每个实例有自己独立的balance和holder——这就是实例属性。
相关原文章节:
sicp/2/1.md(2.1 引言:每个值都有一个类)sicp/2/5.md(2.5 面向对象编程:对象和类、消息传递)
🔍 二、核心原理深挖:对象底层 = 函数 + 字典
这是全书最精彩的一章:放弃点表示法,用"调度字典"(dispatch dictionary)重新实现整个对象系统。看完你会发现,Python 的class语法糖下面藏着的正是这套机制。
2.1 实例的实现:一个会响应消息的函数
对象本质是一个函数,它能响应三种"消息":get(取值)、set(赋值)、__call__(作为函数调用)。属性本身存放在一个名为attributes的本地字典里,外部无法直接访问——这就是对象的"本地状态"。
书中给出的make_instance(cls)函数接收一个类,返回一个新的实例(一个调度字典)。当获取一个属性时:
- 先查实例自己的
attributes字典 - 查不到,就向它的类发消息,继续向上查找
>>> def make_instance(cls): """Return a new object instance, which is a dispatch dictionary.""" def get_value(name): if name in attributes: return attributes[name] ...2.2 类与继承的实现:make_class
类同样是用函数实现的调度字典,它响应get、set、new、__call__四种消息:
new:创建新实例并调用__init__初始化__call__:解释Account('Kirk')这种"调用类"的语法- 属性查找沿**基类链(base class chain)**向上回溯,这就是继承的底层实现
书中原话:在这个对象系统中,唯一应该被用户调用的函数是
make_class,其他所有功能都通过消息传递实现——这与 Python 中"通过class语句定义类、通过点表达式访问一切"的设计完全对应。
📖 完整实现请阅读:sicp/2/6.md(2.6 实现类和对象)
⚡ 三、可变状态让对象成为"演员":从 fib 到记忆化
对象系统的灵魂是本地状态。教材先讲可变数据(sicp/2/4.md),再在效率章节用一个经典例子把"状态 + 行为 = 对象"讲透了:斐波那契数的递归计算。
下面是计算fib(6)时的树形计算模式,可以看到fib(3)的整个过程被重复计算了多次:
如果引入一个带本地状态的memo函数(一个闭包 + 字典——本质上就是一个"迷你对象"),结果就会被缓存复用,计算模式变为:
这个"闭包 + 可变字典"的组合,正是 2.6 节用函数实现对象的雏形——对象不过是把状态和行为捆绑在一起的值。
📖 相关章节:sicp/2/8.md(2.8 效率)、sicp/2/9.md(2.9 递归对象)
📚 四、阅读路线建议:按此顺序吃透对象系统
| 顺序 | 文件路径 | 你将学到 |
|---|---|---|
| 1 | sicp/2/1.md | 类、type与原生数据类型 |
| 2 | sicp/2/4.md | 可变数据与对象隐喻 |
| 3 | sicp/2/5.md | 面向对象编程:实例、继承、调度字典 |
| 4 | sicp/2/6.md | ⭐ 用函数和字典实现类与对象(核心) |
| 5 | sicp/2/7.md | 对象抽象:方法委托与数据抽象 |
| 6 | sicp/3/1.md | 更进一步:解释器本身也是程序 |
✅ 小结
composing-programs-zh 揭示的底层真相其实只有一句话:
对象 = 响应消息的函数 + 存放状态的字典;类 = 定义共享行为并维护基类链的模板。
当你理解了make_instance和make_class,再回头看class、self、super()这些语法时,它们将不再神秘。建议配合sicp/2/6.md动手逐行实现一遍——这是理解 Python 类与对象系统最快的方式。
【免费下载链接】composing-programs-zh🦊 CS61A 教材 Composing Programs 的中文翻译项目地址: https://gitcode.com/gh_mirrors/co/composing-programs-zh
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考