Python 的元類設計起源自哪裡?
一個元老級的 Python 核心開發者曾建議我們( 點擊閱讀),應該廣泛學習其它程式語言的優秀特性,從而提升 Python 在相關領域的能力。在關於元編程方面,他的建議是學習 Hy 和 Ruby。但是,他也提到,他並不知道學習哪種語言,可以加深對 Python 元類設計的理解。
這其實意味著,Python 的元類設計有著很大的原創性,並非借鑒自哪種語言的成熟設計!
既然不是從其它語言中學習來的,那麼,Python 的元類思想到底起源自哪裡呢?Guido 不會是「無中生有」開創出來的設計吧?
下面的一篇譯文,作者是 Guido van Rossum(Python 之父),原文寫於 2013 年 10 月,正是要回答 Python 元類的起源問題:
原文://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 元類的文章://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 萬字的譯了一半後就擱置了好幾個月……)
推薦閱讀:
2、Python 之父爆料:明年至少令 Python 提速 1 倍!
5、從 Python 之父的對話聊起,關於知識產權、知識共享與文章翻譯