大家好,我是正在实战各种 AI 项目的程序员晚枫。
为什么同样的功能,别人写的代码更优雅?
答案:Python 数据模型。掌握它,让你的类像内置类型一样好用。
想象一下,你设计了一个向量类 Vector。你希望它能像数字一样相加、相乘,能打印出友好的字符串表示,能用 len() 获取维度。这些功能不是 Python 自动给你的,而是通过实现特殊方法(也叫魔术方法)来实现的。
🎯 什么是 Python 数据模型?
核心思想
Python 的数据模型是一套协议和约定,它定义了对象如何与 Python 的其他部分交互。通过实现特定的特殊方法,你的对象可以:
- 像数字一样运算(+、-、*、/)
- 像序列一样索引和切片([])
- 像函数一样调用(())
- 像上下文管理器一样使用(with)
- 像迭代器一样遍历(for)
1 | # 普通写法 |
特殊方法的命名
特殊方法都用双下划线开头和结尾,比如:
| 方法 | 作用 | 触发场景 |
|---|---|---|
| init | 初始化 | 创建对象时 |
| repr | 官方字符串表示 | repr()、交互式解释器 |
| str | 用户友好字符串 | str()、print() |
| len | 长度 | len() |
| getitem | 获取元素 | obj[key] |
| setitem | 设置元素 | obj[key] = value |
| add | 加法 | a + b |
| call | 调用 | obj() |
🔑 关键协议
序列协议
实现序列协议,让你的对象像列表一样工作:
1 | class Deck: |
只实现两个方法,Deck 就支持了:
- len() 函数
- 索引访问
- 切片操作
- for 循环遍历
- in 运算符
数值协议
实现数值协议,让你的对象像数字一样运算:
1 | class Vector: |
上下文管理协议
实现上下文管理协议,让你的对象支持 with 语句:
1 | class FileManager: |
💡 实战技巧
1. repr vs str
1 | class Person: |
2. 让类支持迭代
1 | class MyRange: |
3. 鸭子类型
1 | # 不关注类型,只关注行为 |
⚠️ 常见陷阱
1. 可变默认参数
1 | # 错误示例 |
2. 忘记调用父类方法
1 | # 错误示例 |
🎯 本讲总结
通过本讲,我们理解了:
数据模型:Python 对象交互的协议和约定。
特殊方法:让自定义对象像内置类型一样工作。
关键协议:序列协议、数值协议、上下文管理协议等。
实战技巧:repr vs __str__、迭代器实现、鸭子类型。
常见陷阱:可变默认参数、忘记调用父类方法。
📚 推荐教材
《Python 编程从入门到实践(第 3 版)》 - Eric Matthes 著
Python 零基础入门首选。本书分为基础语法和项目实战两部分,适合完全没有编程经验的读者。
《流畅的 Python(第 2 版)》 - Luciano Ramalho 著
Python 进阶经典之作。深入讲解 Python 的高级特性,包括数据模型、函数式编程、面向对象、元编程等。
《CPython 设计与实现》 - Anthony Shaw 著
本书深入讲解 CPython 内部机制,从内存管理到字节码执行,从对象模型到并发编程。配合本课程学习,效果更佳。
学习路线建议:
1 | 零基础 → 《从入门到实践》 → 《流畅的 Python》 → 本门课程 → 《CPython 设计与实现》 |
🔗 课程导航
← 课程大纲 | 下一讲:数据容器深度解析 →
💬 联系我
| 平台 | 账号/链接 |
|---|---|
| 微信 | 扫码加好友 |
| 微博 | @程序员晚枫 |
| 知乎 | @程序员晚枫 |
| 抖音 | @程序员晚枫 |
| 小红书 | @程序员晚枫 |
| B 站 | Python 自动化办公社区 |
主营业务:AI 编程培训、企业内训、技术咨询