一个元老级的 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 万字的译了一半后就搁置了好几个月……)

推荐阅读:

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

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

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

4、聊聊 Python 的内置电池

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

Python 的元类设计起源自哪里?的更多相关文章

  1. python 通过元类控制类的创建

    一.python中如何创建类? 1. 直接定义类 class A: a = 'a' 2. 通过type对象创建 在python中一切都是对象 在上面这张图中,A是我们平常在python中写的类,它可以 ...

  2. Python之元类详解

    一.引子 元类属于Python面向对象编程的深层魔法,99%的人都不得要领,一些自以为搞明白元类的人其实也是自圆其说,点到为止,从队元类的控制上来看就破绽百出,逻辑混乱: 二.什么是元类 一切源自于一 ...

  3. 谈谈Python中元类Metaclass(二):ORM实践

    什么是ORM? ORM的英文全称是“Object Relational Mapping”,即对象-关系映射,从字面上直接理解,就是把“关系”给“对象”化. 对应到数据库,我们知道关系数据库(例如Mys ...

  4. 关于python的元类

    当你创建一个类时: class Foo(Bar): pass Python做了如下的操作: Foo中有__metaclass__这个属性吗?如果是,Python会在内存中通过__metaclass__ ...

  5. Python的元类

    1.用元类验证子类 每当我们定义新类的时候,元类就会运行雅正代码,以确保这个新类符合规定的规范. Python系统把子类的class语句处理完毕,就会调用元类的 __new__ 方法.元类可以通过 _ ...

  6. 理解python的元类

    看了一篇文档,借鉴一下!写下自己对python元类的理解,欢迎各位大神给出意见. 我的理解就是 type用来创建元类,元类用来创建类,类用来创建实例 这样一想,是不是可以认为元类创建类的过程等同于类创 ...

  7. 【转】Python 之 元类

    原文链接: https://stackoverflow.com/questions/100003/what-is-a-metaclass-in-python      http://python.jo ...

  8. Python中元类

    元类(metaclass) 简单地说,元类就是一个能创建类的类,而类class 是由type创建的,class可以创建对象 type与object的关系详见:python中type和object 1. ...

  9. 转---一文读懂 python 的元类

    译注:这是一篇在Stack overflow上很热的帖子.提问者自称已经掌握了有关Python OOP编程中的各种概念,但始终觉得元类(metaclass)难以理解.他知道这肯定和自省有关,但仍然觉得 ...

随机推荐

  1. Codeforces 1076G - Array Game(博弈论+线段树)

    Codeforces 题面传送门 & 洛谷题面传送门 一道 hot tea--听讲解时半懂不懂因为不知道题目意思,最后终究还是琢磨出来了( 首先注意到对于每个 \(a_i\),它具体是什么并不 ...

  2. bitset 的妙用:乱搞字符串匹配

    最近碰到了几次 bitset 乱搞字符串匹配的情况,故写文以记之. 1. 算法简介 核心思想:假设文本串为 \(s\),则对字符集中的每一个字符 \(c\) 开一个大小为 \(|s|\) 的 bits ...

  3. CF840D Destiny

    题目传送门. 题意简述:多次询问求出一个区间最小的出现次数严格大于 \(\frac{r-l+1}{k}\ (2\leq k\leq 5)\) 的最小的数.无解输出 \(-1\). 注意到这个 \(k\ ...

  4. 网络爬虫-python-爬取天涯求职贴

    使用urllib请求页面,使用BeautifulSoup解析页面,使用xlwt3写入Excel import urllib.request from bs4 import BeautifulSoup ...

  5. 10.Power of Two-Leetcode

    Given an integer, write a function to determine if it is a power of two. class Solution { public: bo ...

  6. 在 vscode.dev 中直接运行 Python !纯浏览器环境,无后端!

    其实有挺长一段时间没有写自己的 VS Code 插件了! 还是要感谢我们 DevDiv 组的 Flexible Friday 活动,让我可以在工作日研究自己感兴趣的项目. Flexible Frida ...

  7. c#页面查询、数据显示

    page : <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Queryx ...

  8. javaSE中级篇3——集合体系(另外一种存储容器)——更新完毕

    集合还是一种工具,所以它们的包都在java.util包下 1.集合的整个体系结构(是需要掌握的体系,完全体系不是这样) 对图中所说的 序和重复 这两词的说明: 序:指的是添加进去的元素和取出来的元素 ...

  9. linux 实用指令压缩和解压类

    linux 实用指令压缩和解压类 目录 linux 实用指令压缩和解压类 gzip/gunzip指令(不常用) zip/unzip指令 tar指令(常用) gzip/gunzip指令(不常用) 说明 ...

  10. 学习java 7.4

     学习内容:遍历字符串要点:for(int i = 0;i < line.length();i++) { System.out.println(line.chatAt(i)); } 字符串拼接: ...