- 前言
- 目标读者
- 非目标读者
- 本书的结构
- 以实践为基础
- 硬件
- 杂谈:个人的一点看法
- Python 术语表
- Python 版本表
- 排版约定
- 使用代码示例
- 第一部分 序幕
- 第 1 章 Python 数据模型
- 第二部分 数据结构
- 第 2 章 序列构成的数组
- 第 3 章 字典和集合
- 第 4 章 文本和字节序列
- 第三部分 把函数视作对象
- 第 5 章 一等函数
- 第 6 章 使用一等函数实现设计模式
- 第 7 章 函数装饰器和闭包
- 第四部分 面向对象惯用法
- 第 8 章 对象引用、可变性和垃圾回收
- 第 9 章 符合 Python 风格的对象
- 第 10 章 序列的修改、散列和切片
- 第 11 章 接口:从协议到抽象基类
- 第 12 章 继承的优缺点
- 第 13 章 正确重载运算符
- 第五部分 控制流程
- 第 14 章 可迭代的对象、迭代器和生成器
- 14.1 Sentence 类第1版:单词序列
- 14.2 可迭代的对象与迭代器的对比
- 14.3 Sentence 类第2版:典型的迭代器
- 14.4 Sentence 类第3版:生成器函数
- 14.5 Sentence 类第4版:惰性实现
- 14.6 Sentence 类第5版:生成器表达式
- 14.7 何时使用生成器表达式
- 14.8 另一个示例:等差数列生成器
- 14.9 标准库中的生成器函数
- 14.10 Python 3.3 中新出现的句法:yield from
- 14.11 可迭代的归约函数
- 14.12 深入分析 iter 函数
- 14.13 案例分析:在数据库转换工具中使用生成器
- 14.14 把生成器当成协程
- 14.15 本章小结
- 14.16 延伸阅读
- 第 15 章 上下文管理器和 else 块
- 第 16 章 协程
- 第 17 章 使用期物处理并发
- 第 18 章 使用 asyncio 包处理并发
- 第六部分 元编程
- 第 19 章 动态属性和特性
- 第 20 章 属性描述符
- 第 21 章 类元编程
- 结语
- 延伸阅读
- 附录 A 辅助脚本
- Python 术语表
- 作者简介
- 关于封面
1.6 延伸阅读
对本章内容和本书主题来说,Python 语言参考手册里的“Data Model”一章(<>)是最符合规范的知识来源。
Alex Martelli 的《Python 技术手册(第 2 版)》对数据模型的讲解很精彩。我写这本书的时候,《Python 技术手册》的最新版本是 2006 年出版的,书里用的还是 Python 2.5,但是 Python 关于数据模型的概念并没有太大的变化,而书中 Martelli 对属性访问机制的描述,应该是除了 CPython 中的 C 源码之外在这方面最权威的解释。Martelli 还是 Stack Overflow 上的高产贡献者,在他名下差不多有 5000 条答案,你也可以去他的 Stack Overflow 主页上看看。
David Beazley 著有两本基于 Python 3 的书,其中对数据模型进行了详尽的介绍。一本是《Python 参考手册(第 4 版)》8,另一本是与 Brian K. Jones 合著的《Python Cookbook(第 3 版)中文版》。
8该书已由人民邮电出版社出版,书号:978-7-115-24259-4。——编者注
由 Gregor Kiczales、Jim des Rivieres 和 Daniel G. Bobrow 合著的 The Art of the Metaobject Protocol(又称 AMOP,MIT 出版社,1991 年)一书解释了元对象协议(metaobject protocol,MOP)的概念,而 Python 数据模型便是对这一概念的一种阐释。
杂谈
数据模型还是对象模型
Python 文档里总是用“Python 数据模型”这种说法,而大多数作者提到这个概念的时候会说“Python 对象模型”。Alex Martelli 的《Python 技术手册(第 2 版)》和 David Beazley 的《Python 参考手册(第 4 版)》是这个领域中最好的两本书,但是他们也总说“Python 对象模型”。维基百科中对象模型的第一个定义是:计算机编程语言中对象的属性。这正好是“Python 数据模型”所要描述的概念。我在本书中一直都会用“数据模型”这个词,首先是因为在 Python 文档里对这个词有偏爱,另外一个原因是 Python 语言参考手册中与这里讨论的内容最相关的一章的标题就是“数据模型”。
魔术方法
在 Ruby 中也有类似“特殊方法”的概念,但是 Ruby 社区称之为“魔术方法”,而实际上 Python 社区里也有不少人用的是后者。而我恰恰认为“特殊方法”是“魔术方法”的对立面。Python 和 Ruby 都利用了这个概念来提供丰富的元对象协议,这不是魔术,而是让语言的用户和核心开发者拥有并使用同样的工具。
考虑一下 JavaScript,情况就正好反过来了。JavaScript 中的对象有不透明的魔术般的特性,而你无法在自定义的对象中模拟这些行为。比如在 JavaScript 1.8.5 中,用户的自定义对象不能有只读属性,然而不少 JavaScript 的内置对象却可以有。因此在 JavaScript 中,只读属性是“魔术”般的存在,对于普通的 JavaScript 用户而言,它就像超能力一样。2009 年推出的 ECMAScript 5.1 才让用户可以定义只读属性。JavaScript 中跟元对象协议有关的部分一直在进化,但由于历史原因,这方面它还是赶不上 Python 和 Ruby。
元对象
The Art of the Metaobject Protocal (AMOP)是我最喜欢的计算机图书的标题。客观来说,元对象协议这个词对我们学习Python 数据模型是有帮助的。元对象所指的是那些对建构语言本身来讲很重要的对象,以此为前提,协议也可以看作接口。也就是说,元对象协议是对象模型的同义词,它们的意思都是构建核心语言的 API。
一套丰富的元对象协议能让我们对语言进行扩展,让它支持新的编程范式。AMOP 的第一作者 Gregor Kiczales 后来成为面向方面编程的先驱,他写出了一个 Java 扩展叫 AspectJ,用来实现他对面向方面编程的理念。其实在 Python 这样的动态语言里,更容易实现面向方面编程。现在已经有几个 Python 框架在做这件事情了,其中最重要的是 zope.interface(http://docs.zope.org/zope.interface/)。第11 章的延伸阅读里会谈到它。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论