拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 Python 的元类设计起源自哪里?

Python 的元类设计起源自哪里?

白鹭 - 2022-01-24 2070 0 0

一个元老级的 Python 核心开发者曾建议我们( 点击阅读),应该广泛学习其它编程语言的优秀特性,从而提升 Python 在相关领域的能力,在关于元编程方面,他的建议是学习 Hy 和 Ruby,但是,他也提到,他并不知道学习哪种语言,可以加深对 Python 元类设计的理解,

这其实意味着,Python 的元类设计有着很大的原创性,并非借鉴自哪种语言的成熟设计!

既然不是从其它语言中学习来的,那么,Python 的元类思想到底起源自哪里呢?Guido 不会是“无中生有”开创出来的设计吧?

下面的一篇译文,作者是 Guido van Rossum(Python 之父),原文写于 2013 年 10 月,正是要回答 Python 元类的起源问题:

python-ideas 上有人猜测 Python 的元类设计是起源自 Ruby,事实并非如此,既然是关于语言特性的起源,我觉得我有必要来澄清下事实,

关于元类,我并没有受过 Ruby 的启发(今后也不会),事实上,Ruby 受到过 Python 的启发,Mats 曾经告诉我,他的灵感有 20% 来自 Python,有 80% 来自 Perl,而且 Larry Wall 是他心目中的英雄,

(译注:Larry Wall 是 Perl 语言之父,他曾在 2014 年访华,《程序员》杂志做过一期专访,推荐一读 ,)

我在 1998 年写过关于 Python 元类的文章:http://www.python.org/doc/essays/metaclasses

Guido 的元类随笔

(作者注:那篇 1998 年的文章里包含了一个功能完整的 Enum 实作,它有许多与 PEP-435 相同的特性,)

新式类只是这个想法的第二或第三次迭代物,

我实作新式类的灵感来自于一本书,即 Ira Forman 和 Scott Danforth 写的《Putting Metaclasses to Work》,

豆瓣有收录

亚马逊这个价格真的吓尿我了!

但即便是在 Python 最初的设计中(1990 年,发布于 1991 年),型别(type)本身就是一个物件,任何物件中的型别指标总是指向一个特殊物件,该物件的“资料”是一堆实作其它物件行为的 C 函式指标,类似于 C++ 的虚函式表,

一个型别的型别始终是一个特殊的型别物件(The type of a type was always a special type object),你可以将其称为元型别(meta-type),因为它是自己的型别,

当时我对 Smalltalk 只有模糊的了解;当我后来读到它的元类设计时,我感到很惊讶,因为它与 Python 或 Ruby 中的元类有很大的不同!

但是,Smalltalk 的字节码对 Python 的字节码影响很大,我在 Adele Goldberg 和其他人的一本书中读到过,好像是《Smalltalk-80: The Language and its Implementation》,

smalltalk书

(译文完)

以上文章出自 Guido 的《The History of Python》系列,该系列主要是关于 Python 语言及社区的发展历史,我曾翻译过该系列的最新一篇《pgen 决议器的起源》,曾打算把其它文章也陆续翻译出来……(只是曾)……

巧合的是,就在本文刚译完而查资料时,我无意中发现有人在 2019 年上半年已经把该系列翻译出来了(他翻译了 25 篇,正好不含我所译的最新一篇)!这些译文,我竟然一直从未阅读过!

该译者也有公众号,我好奇翻看了一些文章,发现不少的阅读量只有 10 几个!看来那位译者是没有怎么花心思运营啊,纯粹是当做了一种学习兴趣,默默做事,不求掌声,

所以,如果你对 Python 历史相关内容感兴趣的话,我诚心推荐你关注“ReadingPython”,查看其历史文章,(另外,该译者正在译《Python behind the scenes》系列,这也是我的翻译计划之一,而且实际已经把一篇 1.4 万字的译了一半后就搁置了好几个月……)

推荐阅读:

1、与 Python 之父聊天:更快的 Python!

2、Python 之父爆料:明年至少令 Python 提速 1 倍!

3、Python之父重回决策层,未来如何发展?

4、聊聊 Python 的内置电池

5、从 Python 之父的对话聊起,关于知识产权、知识共享与文章翻译

标签:

0 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *