一个元老级的 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. AutoHotkey

    ;注释 : #==win !==Alt  ^==Ctr  +==shift 需要注意的是不要和现有的快捷键冲突,他会代替掉原来的快捷键操作很难受的. 热指令: 比如 ::yx1::1359720840 ...

  2. 7.4 k8s结合ceph rbd、cephfs实现数据的持久化和共享

    1.在ceph集群中创建rbd存储池.镜像及普通用户 1.1.存储池接镜像配置 创建存储池 root@u20-deploy:~# ceph osd pool create rbd-test-pool1 ...

  3. 2017Java前景怎么样?

    当今社会互联网软件行业属于高薪技术行业,伴随着互联网的发展Java在Web领域的优势也日渐凸显,并且java语言本身就应用最广泛,最高效.据说,全球有25亿Java器件运行着Java,450多万Jav ...

  4. 洛谷 P6060 - [加油武汉]传染病研究(数论)

    洛谷题面传送门 一道不算太难的题,题解稍微写写吧( 首先根据约数个数和公式,对于一个 \(n=p_1^{\alpha_1}·p_2^{\alpha_2}·\cdots·p_m^{\alpha_m}\) ...

  5. 曼哈顿距离最小生成树 codechef Dragonstone

    曼哈顿距离最小生成树 codechef Dragonstone 首先,对于每一个点来说有用的边只有它向它通过 x=0,y=0,y=x,y=-x 切出来的八个平面的最近点. 证明 我不会 反正当结论记住 ...

  6. miRNA分析--数据过滤(一)

    miRNA 数据过滤我使用cutadapt 1 cutadapt -a AGATCGGAAGAGCACACGTCT -m 15 -q 20 --discard-untrimmed -o outname ...

  7. Oracle-一张表中增加计算某列值重复的次数列,并且把表中其他列也显示出来,或者在显示过程中做一些过滤

    总结: 1.计算某列值(数值or字符串)重复的次数 select 列1,count( 列1 or *) count1  from table1 group by 列1 输出的表为:第一列是保留唯一值的 ...

  8. PHP生成EXCEL,支持多个SHEET

    PHP生成EXCEL,支持多个SHEET 此版本为本人演绎版本,原版本地址http://code.google.com/p/php-excel/ php-excel.class.php: <?p ...

  9. 日常Java 2021/10/21

    Java Iterator(迭代器) 如果需要使用iterator类需要从java.util包中引入它 Java Iterator不是一个集合,它是一种访问集合的方法,用于迭代ArrayList和Ha ...

  10. 日常Java 2021/10/6

    声明自定义异常 class zidingyiException extends Exception{}//定义自己的异常类 单继承 public class A  {} public class B ...