Python 的元類設(shè)計(jì)起源自哪里?
△點(diǎn)擊上方“Python貓”關(guān)注 ,回復(fù)“1”領(lǐng)取電子書

一個(gè)元老級(jí)的 Python 核心開發(fā)者曾建議我們( 點(diǎn)擊閱讀),應(yīng)該廣泛學(xué)習(xí)其它編程語(yǔ)言的優(yōu)秀特性,從而提升 Python 在相關(guān)領(lǐng)域的能力。在關(guān)于元編程方面,他的建議是學(xué)習(xí) Hy 和 Ruby。但是,他也提到,他并不知道學(xué)習(xí)哪種語(yǔ)言,可以加深對(duì) Python 元類設(shè)計(jì)的理解。
這其實(shí)意味著,Python 的元類設(shè)計(jì)有著很大的原創(chuàng)性,并非借鑒自哪種語(yǔ)言的成熟設(shè)計(jì)!
既然不是從其它語(yǔ)言中學(xué)習(xí)來(lái)的,那么,Python 的元類思想到底起源自哪里呢?Guido 不會(huì)是“無(wú)中生有”開創(chuàng)出來(lái)的設(shè)計(jì)吧?
下面的一篇譯文,作者是 Guido van Rossum(Python 之父),原文寫于 2013 年 10 月,正是要回答 Python 元類的起源問(wèn)題:
原文:https://python-history.blogspot.com/2013/10/origin-of-metaclasses-in-python.html
譯者:豌豆花下貓@Python貓?
聲明:本翻譯是出于交流學(xué)習(xí)的目的,基于 CC BY-NC-SA 4.0 授權(quán)協(xié)議。為便于閱讀,內(nèi)容略有改動(dòng),所有圖片皆為譯者所加。
python-ideas 上有人猜測(cè) Python 的元類設(shè)計(jì)是起源自 Ruby。事實(shí)并非如此。既然是關(guān)于語(yǔ)言特性的起源,我覺得我有必要來(lái)澄清下事實(shí)。
關(guān)于元類,我并沒有受過(guò) Ruby 的啟發(fā)(今后也不會(huì))。事實(shí)上,Ruby 受到過(guò) Python 的啟發(fā)。Mats 曾經(jīng)告訴我,他的靈感有 20% 來(lái)自 Python,有 80% 來(lái)自 Perl,而且 Larry Wall 是他心目中的英雄。
(譯注:Larry Wall ?是 Perl 語(yǔ)言之父。他曾在 2014 年訪華,《程序員》雜志做過(guò)一期專訪,推薦一讀)
我在 1998 年寫過(guò)關(guān)于 Python 元類的文章:http://www.python.org/doc/essays/metaclasses

(作者注:那篇 1998 年的文章里包含了一個(gè)功能完整的 Enum 實(shí)現(xiàn),它有許多與 PEP-435 相同的特性。)
新式類只是這個(gè)想法的第二或第三次迭代物。
我實(shí)現(xiàn)新式類的靈感來(lái)自于一本書,即 Ira Forman 和 Scott Danforth 寫的《Putting Metaclasses to Work》。


但即便是在 Python 最初的設(shè)計(jì)中(1990 年,發(fā)布于 1991 年),類型(type)本身就是一個(gè)對(duì)象。任何對(duì)象中的類型指針總是指向一個(gè)特殊對(duì)象,該對(duì)象的“數(shù)據(jù)”是一堆實(shí)現(xiàn)其它對(duì)象行為的 C 函數(shù)指針,類似于 C++ 的虛函數(shù)表。
一個(gè)類型的類型始終是一個(gè)特殊的類型對(duì)象(The type of a type was always a special type object),你可以將其稱為元類型(meta-type),因?yàn)樗亲约旱念愋汀?/p>
當(dāng)時(shí)我對(duì) Smalltalk 只有模糊的了解;當(dāng)我后來(lái)讀到它的元類設(shè)計(jì)時(shí),我感到很驚訝,因?yàn)樗c Python 或 Ruby 中的元類有很大的不同!
但是,Smalltalk 的字節(jié)碼對(duì) Python 的字節(jié)碼影響很大。我在 Adele Goldberg 和其他人的一本書中讀到過(guò),好像是《Smalltalk-80: The Language and its Implementation》。

(譯文完)
以上文章出自 Guido 的《The History of Python》系列,該系列主要是關(guān)于 Python 語(yǔ)言及社區(qū)的發(fā)展歷史。我曾翻譯過(guò)該系列的最新一篇《pgen 解析器的起源》,曾打算把其它文章也陸續(xù)翻譯出來(lái)……(只是曾)……
巧合的是,就在本文剛譯完而查資料時(shí),我無(wú)意中發(fā)現(xiàn)有人在 2019 年上半年已經(jīng)把該系列翻譯出來(lái)了(他翻譯了 25 篇,正好不含我所譯的最新一篇)!這些譯文,我竟然一直從未閱讀過(guò)!
該譯者也有公眾號(hào),我好奇翻看了一些文章,發(fā)現(xiàn)不少的閱讀量只有 10 幾個(gè)!看來(lái)那位譯者是沒有怎么花心思運(yùn)營(yíng)啊,純粹是當(dāng)做了一種學(xué)習(xí)興趣,默默做事,不求掌聲。
所以,如果你對(duì) Python 歷史相關(guān)內(nèi)容感興趣的話,我誠(chéng)心推薦你關(guān)注“ReadingPython”,查看其歷史文章。(另外,該譯者正在譯《Python behind the scenes》系列,這也是我的翻譯計(jì)劃之一,而且實(shí)際已經(jīng)把一篇 1.4 萬(wàn)字的譯了一半后就擱置了好幾個(gè)月……)
推薦閱讀:
2、Python 之父爆料:明年至少令 Python 提速 1 倍!
3、Python之父重回決策層,未來(lái)如何發(fā)展?
5、從 Python 之父的對(duì)話聊起,關(guān)于知識(shí)產(chǎn)權(quán)、知識(shí)共享與文章翻譯

