流畅的 Python(1):Python 数据模型 1

阅读数:9 2019 年 11 月 20 日 16:48

流畅的Python(1):Python 数据模型 1

Guido 对语言设计美学的深入理解让人震惊。我认识不少很不错的编程语言设计者,他们设计出来的东西确实很精彩,但是从来都不会有用户。Guido 知道如何在理论上做出一定妥协,设计出来的语言让使用者觉得如沐春风,这真是不可多得。1
——Jim Hugunin
Jython 的作者,AspectJ 的作者之一,.NET DLR 架构师

1 摘自“ Story of Jython ”,这是 Jython Essentials(Samuele Pedroni 和 Noel Rappin 著,O’Reilly 出版社,2002 年)一书的序。

Python 最好的品质之一是一致性。当你使用 Python 工作一会儿后,就会开始理解 Python 语言,并能正确猜测出对你来说全新的语言特征。

然而,如果你带着来自其他面向对象语言的经验进入 Python 的世界,会对 len(colleciton) 而不是 collection.len() 写法觉得不适。当你进一步理解这种不适感背后的原因之后,会发现这个原因,和它所代表的庞大的设计思想,是形成我们通常说的“Python 风格”(Pythonic)的关键。这种设计思想完全体现在 Python 的数据模型上,而数据模型所描述的 API,为使用最地道的语言特性来构建你自己的对象提供了工具。

数据模型其实是对 Python 框架的描述,它规范了这门语言自身构建模块的接口,这些模块包括但不限于序列、迭代器、函数、类和上下文管理器。

不管在哪种框架下写程序,都会花费大量时间去实现那些会被框架本身调用的方法, Python 也不例外。Python 解释器碰到特殊的句法时,会使用特殊方法去激活一些基本的对象操作,这些特殊方法的名字以两个下划线开头,以两个下划线结尾(例如 __getitem__)。比如 obj[key] 的背后就是 __getitem__ 方法,为了能求得 my_collection[key] 的值,解释器实际上会调用 my_collection.__getitem__(key)

这些特殊方法名能让你自己的对象实现和支持以下的语言构架,并与之交互:

  • 迭代
  • 集合类
  • 属性访问
  • 运算符重载
  • 函数和方法的调用
  • 对象的创建和销毁
  • 字符串表示形式和格式化
  • 管理上下文(即 with 块)

magic 和 dunder
魔术方法(magic method)是特殊方法的昵称。有些 Python 开发者在提到 __getitem__ 这个特殊方法的时候,会用诸如“下划线-下划线- getitem”2 这种说法,但是显然这种说法会引起歧义,因为像 __x 这种命名在 Python 里还有其他含义,3 但是如果完整地说出“下划线-下划线- getitem -下划线-下划线”,又会很麻烦。于是我跟着 Steve Holden,一位技术书作者和老师,学会了“双下- getitem”(dunder-getitem)这种说法。于是乎,特殊方法也叫双下方法(dunder method)。4

2 即 under-under-getitme 的直译。——译者注

3 注 3:详见 9.7 节。

4 我是从 Steve Holden 那里第一次听说 dunder 这个说法的。根据维基百科的解释,Mark Johnson 和 Time Hochberg 是最早在书写中开始使用这个词的人( https://en.wikipedia.org/wiki/Reserved_word#Reserved_ranges )。那是 2002 年 9 月 26 日,他们两人在邮件列表里回复“__(双下划线)怎么念?”这个问题时提到了 dunder,最先回复的是 Johnson( https://mail.python.org/pipermail/python-list/2002-September/112991.html ),11 分钟后 Hochberg 也回复了( https://mail.python.org/pipermail/python-list/2002-September/114716.html )。

流畅的Python(1):Python 数据模型 1

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

评论

发布