news 2026/8/22 13:19:23

Python 的类与对象系统底层是如何实现的?CS61A Composing Programs 中文教程带你一次搞懂

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python 的类与对象系统底层是如何实现的?CS61A Composing Programs 中文教程带你一次搞懂

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类允许创建多个账户实例,每个实例有自己独立的balanceholder——这就是实例属性

相关原文章节:

  • 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)函数接收一个类,返回一个新的实例(一个调度字典)。当获取一个属性时:

  1. 先查实例自己的attributes字典
  2. 查不到,就向它的类发消息,继续向上查找
>>> 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

类同样是用函数实现的调度字典,它响应getsetnew__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 递归对象)

📚 四、阅读路线建议:按此顺序吃透对象系统

顺序文件路径你将学到
1sicp/2/1.md类、type与原生数据类型
2sicp/2/4.md可变数据与对象隐喻
3sicp/2/5.md面向对象编程:实例、继承、调度字典
4sicp/2/6.md⭐ 用函数和字典实现类与对象(核心)
5sicp/2/7.md对象抽象:方法委托与数据抽象
6sicp/3/1.md更进一步:解释器本身也是程序

✅ 小结

composing-programs-zh 揭示的底层真相其实只有一句话:

对象 = 响应消息的函数 + 存放状态的字典;类 = 定义共享行为并维护基类链的模板。

当你理解了make_instancemake_class,再回头看classselfsuper()这些语法时,它们将不再神秘。建议配合sicp/2/6.md动手逐行实现一遍——这是理解 Python 类与对象系统最快的方式。

【免费下载链接】composing-programs-zh🦊 CS61A 教材 Composing Programs 的中文翻译项目地址: https://gitcode.com/gh_mirrors/co/composing-programs-zh

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/22 13:18:45

HTTP 404与500错误全解析:从原理到实战排查指南

1. 从“找不到”到“服务器崩了”:解码404与500错误的实战指南如果你在互联网上冲浪超过五分钟,还没遇到过“404 Not Found”或者“500 Internal Server Error”的页面,那你的运气可能好得可以去买彩票了。这两个状态码,几乎是每个…

作者头像 李华
网站建设 2026/8/22 13:17:34

OptiCommPy模拟线性光纤通道

文章目录原理实现示例原理 在实际光纤中,光信号传输存在诸多非线性效应,比如自相位调制 SPM、交叉相位调制 XPM、四波混频 FWM 等。而对于线性模型而言,则只考虑光线衰减和色度色散这两方面的因素。 从数学角度来说,线性衰减的过…

作者头像 李华
网站建设 2026/8/22 13:16:52

3 步完成量化回测可视化:backtrader-pyqt-ui 实战

3 步完成量化回测可视化:backtrader-pyqt-ui 实战 【免费下载链接】backtrader-pyqt-ui 项目地址: https://gitcode.com/gh_mirrors/bac/backtrader-pyqt-ui 打开界面,改一个参数,点 Run,几秒后图表刷新出新标记——backt…

作者头像 李华