一个元老级的 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. 【Tool】IDEA功能--SVN和Git

    IDEA功能--SVN和Git 2019-11-08  21:12:22  by冲冲 1.IDEA的SVN (1)提交项目代码到SVN服务器 ① 指定不用上传的目录 ② 设置项目上传的路径 SVN服务 ...

  2. 学Web前端开发,选择培训学校是关键--青岛思途

    互联网+的提出,催生了Web前端开发行业更大的就业空间,其行业热度也正呈爆炸式增长.专业人才供不应求导致了从业者薪资的居高不下,一般来说Web前端工程师的年薪可达15w以上,工作3~5年后通常可达到1 ...

  3. [Bzoj 1432] [ZJOI2009]Function(结论推导题)

    我们先看一下题目: (有没有和我一样的朋友看到这道题以为是几何不可做题 这个题目真的很难理解,并且样例也给得太水了吧! 理解题目是必不可少的(这并不是你看了半小时题目的理由)--首先我们先简化题目 1 ...

  4. Congratulations, FYMS-OIers!

    Fuzhou Yan'an Middle School Online Judge 又一次上线啦! 真的是一波三折,主要功劳必须得属于精通网页编排.ubuntu 下如何使用 rm -rf 语句但是又能够 ...

  5. perl中tr的用法(转载)

    转载:http://blog.sina.com.cn/s/blog_4a0824490101hncz.html (1)/c表示把匹配不上的字符进行替换. $temp="AAAABCDEF&q ...

  6. 多选项、多个选择项【c#】

    <%@ Control Language="C#" AutoEventWireup="true" CodeFile="AddDataInfoCe ...

  7. jsp页面中HTML注释与jsp注释的区别

    jsp页面中HTML注释与jsp注释的区别 HTML注释 html注释是 : HTML注释:参与编译,会生成到源码中. 所以,不能使用html注释EL表达式和JSTL标签库 jsp注释 jsp注释是 ...

  8. java Random()用法

    1.random.nextInt() random.nextIn()的作用是随机生成一个int类型,因为int 的取值范围是 -2147483648--2147483647 ,所以生成的数也是处于这个 ...

  9. 学习java 7.3

    学习内容:定义类不需要加static 成员方法在多个对象时是可以共用的,而成员变量不可以共用,多个对象指向一个内存时,改变变量的值,对象所在的类中的变量都会改变 成员变量前加private,成员方法前 ...

  10. map和forEach的区别

    总结 forEach()可以做到的东西,map()也同样可以.反过来也是如此. map()会分配内存空间存储新数组并返回,forEach()不会返回数据. forEach()允许callback更改原 ...