返回介绍

1.6 延伸阅读

发布于 2024-02-05 21:59:48 字数 2409 浏览 0 评论 0 收藏 0

对本章内容和本书主题来说,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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文