Python 的元类设计起源自哪里?

Python的诞生 发明 Python 的动机 Guido 大学毕业后加入了 CWI ,CWI 是荷兰的一家研究中心,它由荷兰政府教育部和其他研究基金资助,对计算机科学和数学进行学术级的研究。在 CWI 中,Guido 参与了 Amoeba 项目。Amoeba 项目是由 Andrew Tanenbaum 负责,CWI 和 Vrije Universiteit Amsterdam 两所机构共同参与开发的基于微内核的分布式系统。 在 Amoeba 项目中,Guido 发现用 C 语言开发系统管理程序所花费的时间太长了,而且因为 阅读详情

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

python系列之---python的起源 根据TIOBE发布的2018年5月编程语言排行,可以看到python作为现在十分火热的语言,一直都是保持在前列。 5 月编程语言排行榜 TOP20 榜单: Top 10编程语言TIOBE指数走势(2002-2018) 今天就介绍一下python语言背后的起源。 Python,由荷兰人Guido van Rossum于1989年发明,第一个公开发行版发行于1991年。 作为pyt... 阅读详情

相关推荐

《Pythonic 单例模式全解析:从模块特性到元类的实战与思辨》

本文全面解析了Python中实现单例模式的多种方法,包括模块特性(最Pythonic的方式)、类变量缓存、装饰器、元类以及Borg模式。每种方法都通过代码示例展示原理,并分析其优缺点和适用场景。文章还提供了线程安全的日志记录器实战案例,探讨了单例模式与现代依赖注入框架的结合,最后对不同实现方式进行了对比总结。全文深入浅出,帮助开发者根据不同需求选择最适合的单例实现方案。

铭渊老黄 1125

python的来源_Python的起源

虽然排行烂大街,但不看总少了些什么来看TIOBE和PYPL编程语言的排行,它们根据搜索引擎对于编程语言的搜索指数或其他的手段,对编程语言进行排名,在一定程度上反映了当前各语言的流行趋势。就像虽然明知道鲁大师的跑分没啥卵用,但是大家还是愿意跑个分.....Python的起源Python语言的创立者Guido van Rossum,大家都亲切地称他“龟叔”,是一位荷兰的计算机研究人员,同时对数学有着很...

weixin_39851918的博客 522

医学图像分割实战:基于TransUNet训练自己的眼底硬渗出物数据集(附完整代码)

本文详细介绍了基于TransUNet的眼底硬渗出物分割实战指南,涵盖数据预处理、模型调优、训练策略及性能优化等关键环节。通过代码复现和实验对比,展示了TransUNet在医学图像分割中的优势,为糖尿病视网膜病变的早期诊断提供技术支持。

weixin_42524708的博客 361

爱上 Python 的五个理由

Python 中有很多我喜欢的特性。 Python 在 1998 年诞生,开始很长一段时间无人问津,但我一直在使用它。当时 Perl 在开源世界中非常流行,但是我从一开始就认定了 Python。我父母喜欢经常拿我之前说的话打趣我,我曾经说过“Python 将会成为很重要的语言”、“我未来将依靠 Python 找到一份工作”。过了一段时间,我的预言应验了。 这门语言有太多让人喜爱的地方了。以下是我如...

LLand520的博客 1102

局域网tcp通信实验

IPv4 地址 . . . . . . . . . . . . : 192.168.92.79。IPv4 地址 . . . . . . . . . . . . : 192.168.92.59。子网掩码 . . . . . . . . . . . . : 255.255.255.0。子网掩码 . . . . . . . . . . . . : 255.255.255.0。使用这篇文章的小工具。

weixin_51883798的博客 430

(一)利用Python实现数据集读取,Python基本文件操作介绍

机器学习是计算机对大量数据的分析过程,在机器学习的实际项目中,通常都需要准备数据集,数据集通常包含的数据数量是庞大的。例如,在处理计算机视觉领域的项目时,每一张图片都是一个单独的文件,为了提高模型训练的效果,图片数量通常会比较多,因此需要合理且高效的操作将所有的图片数据读取。本篇旨在介绍如何用Python对海量文件进行遍历,也是机器学习实践的第一步。.........

ZZR2631574030的博客 6354

Python面向对象编程实战:从语法糖到工程思维重构

面向对象编程(OOP)在Python中不仅是class语法和self关键字的使用,更是一种职责划分、边界控制与协作契约的设计思维。其核心原理在于封装(定义可信接口)、继承与组合的合理取舍、鸭子类型驱动的多态实践,以及抽象机制对能力边界的约束。技术价值体现在提升代码可维护性、支持单元测试、降低模块耦合,并支撑高扩展性系统架构。典型应用场景包括金融风控规则引擎、IoT设备通信模块、医疗影像处理流水线及日志分析系统等生产级项目。本文聚焦Python特有的OOP工程实践,深入解析__slots__、描述符、__ne

weixin_34161032的博客 354

什么是以太网链路聚合

以太网链路聚合技术通过将多个物理端口捆绑成逻辑端口,可显著提升网络性能。该技术能增加总带宽(各链路带宽之和)、提高可靠性(故障秒级切换)并实现智能负载分担。主要分为手工模式和基于LACP协议的动态模式,后者能检测链路故障更可靠。配置时需确保接口参数一致、模式匹配,适用于核心交换、服务器接入等场景。华为设备通过创建Eth-Trunk接口、指定LACP模式并添加成员接口即可完成部署。这项成熟技术能以低成本解决带宽瓶颈和可靠性问题,是构建高速稳定网络的关键方案。

lai_2020的博客 672

python元类单例_Python-元类 单例

2.元类用于创建类的类 叫元类 默认元类都是type主要控制类的创建__init__ 类的实例化__call__3.单例一个类只有一个实例什么时候用,大家公用一个打印机,没有必要每个人创建新的打印机对象 共用一个对象即可===============================元类是什么?源自一句话:在python中,一切皆对象,而对象都是由类实例化得到的本质上元类也是一个类,元类是用...

weixin_39969028的博客 151

拼团系统设计-人群标签的设计与思考

最近在学习一个拼团项目中涉及到的人群模块的设计,写下一些实现与思考。

wywcool的博客 971

保姆级教程:用U盘给浪潮服务器装系统(含RAID驱动加载技巧)

本文提供了一份详细的浪潮服务器U盘安装系统指南,重点介绍了RAID驱动加载技巧与实战步骤。从准备工作到系统安装全流程,涵盖RAID配置、驱动加载方法及常见问题排查,帮助用户高效完成服务器系统部署。特别强调RAID驱动与服务器型号的匹配性,确保安装过程顺利。

uuu88的博客 734

元类

一:元类介绍 “元类就是深度的魔法,99%的用户应该根本不必为此操心”。 如果你想搞清楚究竟是否需要用到元类,那么你就不需要它 那些实际用到元类的人都非常清楚地知道他们需要做什么,而且根本不需要解释为什么要用元类。” —— Python界的领袖 Tim Peters 一切都源自一句话:在Python中,一切皆对象 元类:类他爹 定义类,可以控制对象的产生 元类,可以控制类的产生 # 元类==>People类==>obj类 class People(object): shcool

qq_37719875的博客 305

ESP32脑机接口开发板:EEG信号采集与应用开发指南

脑机接口(BCI)技术通过采集脑电图(EEG)信号实现人机交互,其核心在于高精度生物电信号采集与实时处理。基于ESP32微控制器的开发平台结合专业级ADS1299 ADC芯片,可构建8通道EEG信号采集系统,支持250SPS采样率与可编程增益。这种嵌入式解决方案在科研教育领域具有显著优势,既能满足信号质量要求,又大幅降低开发门槛。典型应用包括实时脑电波可视化、注意力检测等BCI场景,通过Python生态工具链(如BrainFlow、LSL)可快速实现数据处理。开发时需注意电极阻抗控制(<10kΩ)和50/6

weixin_42518874的博客 343

反射 动态导入 元类

isinstance(obj cls) 检查obj是否是cls的对象 issubclass(sub, super) 检测sub是否是super的派生类/子类 class Foo(object): pass obj = Foo() print(isinstance(obj, Foo)) # True class Fo(Foo): pass print(issubc...

weixin_30657999的博客 92

DeepSeek与YOLO融合技术的微信小程序实现方案

本文介绍了一个基于微信小程序和Flask后端的智能图像检测系统。系统采用DeepSeek-7B进行自然语言理解,YOLOv8执行目标检测,并通过融合验证模块确保结果准确性。核心流程包括:用户通过小程序上传图片和文本需求,后端解析意图后执行目标检测,最后验证并返回结果。关键技术包括DeepSeek的指令理解、动态阈值调整和模型优化(ONNX、TensorRT)。系统适用于工业质检等场景,如"检测表面划痕",能自动识别目标并验证结果。部署需GPU服务器,并包含安全机制保障系统稳定运行。

老郑的博客 271

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Python-元类 单例

2.元类 用于创建类的类 叫元类 默认元类都是type 主要控制类的创建__init__ 类的实例化__call__3.单例 一个类只有一个实例 什么时候用,大家公用一个打印机,没有必要每个人创建新的打印机对象 共用一个对象即可===============================元类是什么? 源自一句话:在python中,一切皆对象,而对象都是由类实...

weixin_34195364的博客 108

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

爬虫 (三十) python 类和对象object (二十一)

长文预警阅读约5分钟相信如果你慢慢把这篇文章读完,然后合并实践,你重组python函数会有很大的理解,加油看完哦经过上述三节,穿插讲了一下HTTP的知识点,以及浏览器的界面资源的获...

人生代码 ---- 公众号 1246

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

python对象与实例_python中的对象与实例

小编典典在Python中,类定义(即类的主体)称为对象实际上,这在Python中仍称为类。这就是为什么要这样定义它:class Foo(object):pass使用class关键字是因为结果仍称为类。object括号中的单词表示Foo源自名为的类object。请勿混淆-这里可以使用任何现有的类;实际上不止一个。您通常从中得出类的原因object是历史性的意外,但可能值得详细说明。Python的原始...

weixin_26968079的博客 1061

python3基础入门巩固94题--源自github

Day1 level1: 1、写一个程序,找出[2000,3200]中所有能被7整除但不是5的倍数的数,结果以逗号分隔打印在一行中。 # 解1 num = [] for i in range(2000, 3201): if i % 7 == 0: if i % 5 != 0: num.append(i) print(num) # 解2 num = [] for i in range(2000, 3201): if (i%7 == 0) a

weixin_43896364的博客 925

Django 的动态特性:从 Python 动态机制到框架设计思想

Django 的动态特性让它在快速开发中极具优势。你可以即时修改模型、切换数据库、动态加载视图,无需编译,无需额外注册。但这也带来一定代价:类型系统不够严格,IDE 难以提供完整的静态推断支持(例如.objects的补全)。灵活是一种力量,也是一种责任。Django 让开发者获得了极高的自由度,但同时也要求更强的代码规范意识与测试能力。

DaPiCaoMin的博客 1133

Instaloader 高级代码示例指南:用 Python 模块实现按时间下载、粉丝画像与元数据挖掘

本指南以 Instaloader 官方文档 [docs/codesnippets.rst](https://link.gitcode.com/i/0b7d3fc3d48d21dc6bee224e927a2dbc) 及其配套代码片段目录 [docs/codesnippets](https://link.gitcode.com/i/324205c26987e700a7d012d5a7610fd1) 为

gitblog_00210的博客 702

python面对对象爬虫_爬虫 (三十) python 类和对象object (二十一)

长文预警 阅读约5分钟相信如果你慢慢把这篇文章读完,然后合并实践,你重组python函数会有很大的理解,加油看完哦经过上述三节,穿插讲了一下HTTP的知识点,以及浏览器的界面资源的获取,以及运行过程,我们可以收获到很多东西,如果没有好好看的伙伴可以趁热打铁类的一般知识Python中,所有数据类型都可以视为对象,当然也可以自定义对象。自定义的对象数据类型就是面向对象中的类(Class)的概念。用类...

weixin_39636164的博客 190

YDOOK:PyDraw 所见即所得 Python GUI 绘制框架 编程源自 JY Lin

PyDraw 个人开源软件 所见即所得 Python GUI 绘制框架 PyDraw 是基于 Python + Tkinter 的可视化、所见即所得 GUI 绘制框架。轻松绘制基本 UI 界面,一键得出 GUI 代码。 GitHub 软件主页 OSCHINA 软件主页 PyDraw 由本人JY Lin 独立编写的,基于 Python + Tkinter 的可视化,所见即所得GUI绘制框架。轻松绘制...

YDOOK 1662

[Python-Twisted] 源码中的interface Implement 分析

使用接口的好处多多在Gang of Four所编写的经典软件工程书籍《设计模式》  中推荐“要面向接口而不要面向实现编程”。规范的进行接口定义有助于更好的理解系统Python是不支持接口的。但是为什么Twisted源码中到处是Interface和 Implement呢?原来所有的Interface和implement不是源自twisted,而是Zope。这是第二次遇到这个,第一次是pl

ring8595的专栏 1557

Atomic AI Agent Platform:开源自托管智能自动化终极指南

Atomic是一个开源的AI智能体平台,专为企业级自动化工作流设计。这个自托管解决方案将视觉化工作流构建器与基于LLM的智能体相结合,让您能够通过语音或文本指令创建和执行复杂的业务自动化流程。项目采用Python + FastAPI + PostgreSQL/SQLite技术栈,支持46+业务集成,提供完整的多智能体治理系统和上下文记忆管理。 ## 架构设计与技术栈深度解析 Atomic平台采

gitblog_00658的博客 464
上一篇: Phonemizer | Python文本语音(音素)表征包
下一篇: 备战金三银四,耗时两个月整理的Python全套资料,学完实现月薪30K以上,纯分享
Python_xiaowu
博客等级 码龄5年 3096粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值