00 · 理解本课程所需的 Python 机制
理解本课程所需的 Python 机制¶
从运算符分派、装饰器和 dataclass 入手,弄清屏幕上的表达式如何到达库中的方法。
阅读本章前
你已经会读函数、类、条件分支和基本类型标注。
完成本章后,你可以
- 用自己的话说明“理解本课程所需的 Python 机制”中的数学定义
- 指出定义在 Python 数据中的表示方式
- 根据实际实现预测一段小规模执行过程
数学定义
在 Python 中,`a + b` 和 `a == b` 会分别请求对象的 `__add__` 与 `__eq__`。装饰器在定义阶段接收并替换函数对象。
数据表示
冻结的 dataclass 保存不可变的数学值。被 `@log` 包装的方法在内部返回结果和延迟生成的消息,包装器对调用者只暴露结果。
Python 实现
`+` → `__add__`; `==` → `__eq__`; `@log` → `inner`
与本章一起阅读的实现和测试
数学定义
数学定义¶
在 Python 中,a + b 和 a == b 会分别请求对象的 __add__ 与 __eq__。装饰器在定义阶段接收并替换函数对象。
数据表示
数据表示¶
冻结的 dataclass 保存不可变的数学值。被 @log 包装的方法在内部返回结果和延迟生成的消息,包装器对调用者只暴露结果。
Python 实现
Python 实现¶
log 中的 inner 调用原方法,取出 (result, message),按日志设置输出消息,再返回 result;@wraps 保留原函数信息。
本课程使用的精确对应关系:
执行过程
执行过程¶
先完成方法本体,包装器才获得消息。因此递归调用的内部结果会先于外层日志出现。
运行前预测
预测 `structural_str()` 与 `+` 分别会调用什么代码,并写下两行打印结果。
实验 · 理解本课程所需的 Python 机制
尚未运行
⌘ / Ctrl + Enter
输出
请先写下预测,再运行。
用测试核对
用测试核对¶
测试检查返回值、公开签名和延迟消息,防止装饰器改变库的正常接口。
适用范围
适用范围¶
本章不重讲循环和变量等基础语法,只解释理解本库不可缺少的元编程行为。