流畅的 Python(10):Python 数据模型 1.6

阅读数:14 2019 年 11 月 20 日 16:50

流畅的Python(10):Python 数据模型 1.6

内容简介
本书致力于帮助 Python 开发人员挖掘这门语言及相关程序库的优秀特性,避免重复劳动,同时写出简洁、流畅、易读、易维护,并且具有地道 Python 风格的代码。本书尤其深入探讨了 Python 语言的高级用法,涵盖数据结构、Python 风格的对象、并行与并发,以及元编程等不同的方面。

(延伸阅读)

对本章内容和本书主题来说,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 版)》1,另一本是与 Brian K. Jones 合著的《Python Cookbook(第 3 版)中文版》。

1 该书已由人民邮电出版社出版,书号: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 对象模型”。维基百科中对象模型的第一个定义( http://en.wikipedia.org/wiki/Object_model )是:计算机编程语言中对象的属性。这正好是“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 ProtocalAMOP)是我最喜欢的计算机图书的标题。客观来说,元对象协议这个词对我们学习 Python 数据模型是有帮助的。元对象所指的是那些对建构语言本身来讲很重要的对象,以此为前提,协议也可以看作接口。也就是说,元对象协议是对象模型的同义词,它们的意思都是构建核心语言的 API。
一套丰富的元对象协议能让我们对语言进行扩展,让它支持新的编程范式。AMOP 的第一作者 Gregor Kiczales 后来成为面向方面编程的先驱,他写出了一个 Java 扩展叫 AspectJ,用来实现他对面向方面编程的理念。其实在 Python 这样的动态语言里,更容易实现面向方面编程。现在已经有几个 Python 框架在做这件事情了,其中最重要的是 zope.interface http://docs.zope.org/zope.interface/ )。第 11 章的延伸阅读里会谈到它。

流畅的Python(10):Python 数据模型 1.6

图灵地址 https://www.ituring.com.cn/book/1564

评论

发布