Python 的元類設計起源自哪裡?
一個元老級的 Python 核心開發者曾建議我們( 點選閱讀),應該廣泛學習其它程式語言的優秀特性,從而提升 Python 在相關領域的能力。在關於超程式設計方面,他的建議是學習 Hy 和 Ruby。但是,他也提到,他並不知道學習哪種語言,可以加深對 Python 元類設計的理解。
這其實意味著,Python 的元類設計有著很大的原創性,並非借鑑自哪種語言的成熟設計!
既然不是從其它語言中學習來的,那麼,Python 的元類思想到底起源自哪裡呢?Guido 不會是“無中生有”開創出來的設計吧?
下面的一篇譯文,作者是 Guido van Rossum(Python 之父),原文寫於 2013 年 10 月,正是要回答 Python 元類的起源問題:
原文:https://python-history.blogspot.com/2013/10/origin-of-metaclasses-in-python.html
譯者:豌豆花下貓@Python貓
宣告:本翻譯是出於交流學習的目的,基於 CC BY-NC-SA 4.0 授權協議。為便於閱讀,內容略有改動,所有圖片皆為譯者所加。
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
(作者注:那篇 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》。
(譯文完)
以上文章出自 Guido 的《The History of Python》系列,該系列主要是關於 Python 語言及社群的發展歷史。我曾翻譯過該系列的最新一篇《pgen 解析器的起源》,曾打算把其它文章也陸續翻譯出來……(只是曾)……
巧合的是,就在本文剛譯完而查資料時,我無意中發現有人在 2019 年上半年已經把該系列翻譯出來了(他翻譯了 25 篇,正好不含我所譯的最新一篇)!這些譯文,我竟然一直從未閱讀過!
該譯者也有公眾號,我好奇翻看了一些文章,發現不少的閱讀量只有 10 幾個!看來那位譯者是沒有怎麼花心思運營啊,純粹是當做了一種學習興趣,默默做事,不求掌聲。
所以,如果你對 Python 歷史相關內容感興趣的話,我誠心推薦你關注“ReadingPython”,檢視其歷史文章。(另外,該譯者正在譯《Python behind the scenes》系列,這也是我的翻譯計劃之一,而且實際已經把一篇 1.4 萬字的譯了一半後就擱置了好幾個月……)
推薦閱讀: