发布时间:2026/6/14 20:57:55
Python 高手编程系列三千四百二十一:元类
元类metaclass是一个 Python 特性许多人认为它是这门语言最难的内容之一因此许多程序员都避免使用它。事实上一旦你理解了几个基本概念它并不像听起来那么复杂。作为回报了解这一特性之后你能够完成一些其他方法无法完成的事情。元类是定义其他类型的一种类型。为了理解其工作方式最重要的是要知道定义了对象实例的类也是对象。因此如果它也是对象的话那么一定有与其相关联的类。所有类定义的基类都是内置的 type 类。在 Python 中可以将某个类的元类替换为我们自定义的类型。通常来说新的元类仍然是 type 类的子类参见图 3-4因为如果不是的话这个类将在继承方面与其他的类非常不兼容。一般语法调用内置的 type()类可作为 class 语句的动态等效。给定名称、基类和包含属性的映射它会创建一个新的类对象def method(self):return 1klass type(‘MyClass’, (object,), {‘method’: method})其输出如下instance klass()instance.method()1这种写法等价于类的显式定义class MyClass:def method(self):return 1你会得到如下结果instance MyClass()instance.method()1用 class 语句创建的每个类都隐式地使用 type 作为其元类。可以通过向 class 语句提供 metaclass 关键字参数来改变这一默认行为class ClassWithAMetaclass(metaclasstype):passmetaclass 参数的值通常是另一个类对象但它可以是任意可调用对象只要接受与 type 类相同的参数并返回另一个类对象即可。调用签名为 type(name, bases,namespace)其解释如下。• name这是将保存在__name__属性中的类名称。• bases这是父类的列表将成为__bases__属性并用于构造新创建的类的 MRO。• namespace这是包含类主体定义的命名空间映射将成为__dict__属性。思考元类的一种方式是__new__()方法但是在更高一级的类定义中思考。虽然可以用显式调用 type()的函数来替代元类但通常的做法是使用继承自 type的另一个类。元类的常用模板如下class Metaclass(type):defnew(mcs, name, bases, namespace):return super().new(mcs, name, bases, namespace)classmethoddefprepare(mcs, name, bases, **kwargs):return super().prepare(name, bases, **kwargs)definit(cls, name, bases, namespace, **kwargs):super().init(name, bases, namespace)defcall(cls, *args, **kwargs):return super().call(*args, **kwargs)name、bases 和 namespace 参数的含义与前面介绍的 type()调用中的参数相同但以下 4 个方法的作用却各不相同。•new(mcs, name, bases, namespace)复杂类对象的实际创建其创建方式与普通类相同。第一个位置参数是一个元类对象。在上面的例子中它就是Metaclass。注意mcs 是这一参数常用的命名约定。•prepare(mcs, name, bases, **kwargs)这会创建一个空的命名空间对象。默认返回一个空的 dict但可以覆写并使其返回其他任何映射类型。注意它不接受 namespace 作为参数因为在调用它之前命名空间并不存在。•init(cls, name, bases, namespace, **kwargs)这在元类实现中并不常见但其含义与普通类中的含义相同。一旦__new__()创建完成它可以执行其他类对象初始化过程。现在第一个位置参数的命名约定为 cls说明它已经是一个创建好的类对象元类的实例而不是一个元类对象。init()被调用时类已经构建完成所以这一方法可以做的事情比__new__()要少。实现这样的方法非常类似于使用类装饰器但主要的区别在于每个子类都会调用init()而类装饰器则不会被子类调用。•call(cls, *args,kwargs)当调用元类实例时会调用这一方法。元类实例是一个类对象参见图 3-3在创建类的新实例时会调用它。这一方法可用于覆写类实例创建和初始化的默认方式。上述所有方法都可以接受额外的关键字参数这里用kwargs 表示。这些参数可以在类定义中通过额外的关键字参数传入到元类对象中其代码如下class Klass(metaclassMetaclass, extra“value”):pass在一开始如果没有适当的例子这么大的信息量是很难消化的。所以我们将利用一些 print()命令对元类、类和实例的创建过程进行追踪class RevealingMeta(type):defnew(mcs, name, bases, namespace, **kwargs):print(mcs, “newcalled”)return super().new(mcs, name, bases, namespace)classmethoddefprepare(mcs, name, bases, **kwargs):print(mcs, “preparecalled”)return super().prepare(name, bases, **kwargs)definit(cls, name, bases, namespace, **kwargs):print(cls, “initcalled”)super().init(name, bases, namespace)defcall(cls, *args, **kwargs):print(cls, “callcalled”)return super().call(*args, **kwargs)利用 RevealingMeta 作为元类来创建新的类定义在 Python 交互式会话中会给出下列输出class RevealingClass(metaclassRevealingMeta):… def __new __(cls):… print(cls, __new __ called)… return super(). __new __(cls)… def __init __(self):… print(self, __init __ called)… super(). __init __()…class ‘RevealingMeta’ __prepare __ calledclass ‘RevealingMeta’ __new __ calledclass ‘RevealingClass’ __init __ calledinstance RevealingClass()class ‘RevealingClass’ __call __ calledclass ‘RevealingClass’ __new __ calledRevealingClass object at 0x1032b9fd0 __init __ called

相关新闻

Python 高手编程系列四百二十二:函数注解
2026/6/14 20:57:55

Python 高手编程系列四百二十二:函数注解

函数注解是 Python 3 最独特的功能之一。官方文档是这么说的:函数注解是关于用户 自定义函数使用的类型的完全可选的元信息,但事实上,它并不局限于类型提示,而且在 Python 及其标准库中也没有单个功能可以利用这种注解。这就是这个…

阅读更多
Python 高手编程系列三千四百二十二:函数注解
2026/6/14 20:57:55

Python 高手编程系列三千四百二十二:函数注解

函数注解是 Python 3 最独特的功能之一。官方文档是这么说的:函数注解是关于用户 自定义函数使用的类型的完全可选的元信息,但事实上,它并不局限于类型提示,而且在 Python 及其标准库中也没有单个功能可以利用这种注解。这就是这个…

阅读更多
MPC8309 DDR2内存控制器时序配置实战:从寄存器解析到信号完整性调试
2026/6/14 20:57:55

MPC8309 DDR2内存控制器时序配置实战:从寄存器解析到信号完整性调试

1. 项目概述与核心挑战在嵌入式系统开发,尤其是基于Power Architecture或类似架构的通信处理器设计中,DDR内存控制器的配置往往是硬件工程师和底层驱动开发者必须啃下的硬骨头。它不像应用层编程那样有清晰的逻辑和丰富的调试信息,更多时候&a…

阅读更多
Layerdivider:3步实现智能图像分层的终极免费方案
2026/6/14 21:57:55

Layerdivider:3步实现智能图像分层的终极免费方案

Layerdivider:3步实现智能图像分层的终极免费方案 【免费下载链接】layerdivider A tool to divide a single illustration into a layered structure. 项目地址: https://gitcode.com/gh_mirrors/la/layerdivider 你是否曾面对一张复杂的插画或设计图&#…

阅读更多
别再截图了!手把手教你将Cadence仿真数据导入Matlab,画出论文级的精美曲线
2026/6/14 21:57:55

别再截图了!手把手教你将Cadence仿真数据导入Matlab,画出论文级的精美曲线

科研绘图效率革命:从Cadence到Matlab的出版级数据可视化全攻略在电子工程和集成电路设计领域,科研人员常常面临一个尴尬的困境——花费大量时间完成的电路仿真,最终却因为图像质量不达标而无法直接用于论文发表。传统截图方式不仅分辨率低&am…

阅读更多
FModel深度技术解析:虚幻引擎资源浏览器的架构设计与实现原理
2026/6/14 21:57:55

FModel深度技术解析:虚幻引擎资源浏览器的架构设计与实现原理

FModel深度技术解析:虚幻引擎资源浏览器的架构设计与实现原理 【免费下载链接】FModel Unreal Engine Archives Explorer 项目地址: https://gitcode.com/gh_mirrors/fm/FModel FModel作为一款基于CUE4Parse核心解析库的虚幻引擎资源浏览器,为游戏…

阅读更多
5分钟掌握UniHacker:终极跨平台Unity破解工具完整指南
2026/6/14 21:57:55

5分钟掌握UniHacker:终极跨平台Unity破解工具完整指南

5分钟掌握UniHacker:终极跨平台Unity破解工具完整指南 【免费下载链接】UniHacker 为Windows、MacOS、Linux和Docker修补所有版本的Unity3D和UnityHub 项目地址: https://gitcode.com/GitHub_Trending/un/UniHacker 还在为Unity许可证费用而烦恼吗&#xff1…

阅读更多
2026年6月国内十大品牌策划公司权威榜单发布:专业能力与真实口碑双重认证
2026/6/14 21:57:55

2026年6月国内十大品牌策划公司权威榜单发布:专业能力与真实口碑双重认证

本榜单数据基于2025—2026年度国内主流商业咨询平台公开案例库、企业工商注册信息、行业协会会员名录、主流企业服务评价平台用户反馈,以及对近两年委托过品牌策划服务的316位中小企业负责人的定向回访。我们联合中国广告协会学术委员会专家、知名品牌战略学者及资深…

阅读更多
Python 高手编程系列三千四百二十一:元类
2026/6/14 20:57:55

Python 高手编程系列三千四百二十一:元类

元类(metaclass)是一个 Python 特性,许多人认为它是这门语言最难的内容之一,因 此许多程序员都避免使用它。事实上,一旦你理解了几个基本概念,它并不像听起来那么 复杂。作为回报,了解这一特性之…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/14 0:57:30

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)
2026/6/14 0:57:30

别再只用BERT了!用Transformers库的AutoModel,5分钟搞定文本相似度计算(附代码对比)

超越BERT:用Transformers库高效实现文本相似度计算的三种实战方案在自然语言处理领域,文本相似度计算是信息检索、问答系统和推荐系统等应用的核心技术。传统方法如TF-IDF或Word2Vec已逐渐被基于Transformer的预训练模型所取代。Hugging Face的Transform…

阅读更多
Prompt Engineering:重构人机协作的工程化方法论
2026/6/14 0:57:30

Prompt Engineering:重构人机协作的工程化方法论

1. 项目概述:这不是“写提示词”,而是重构人机协作的底层逻辑“Prompt Engineering”这个词,这两年被讲得太多,也太轻飘。很多人把它理解成“给AI发指令的技巧”,甚至简化为“多加几个形容词”“换种说法再试一次”。我…

阅读更多
Anthropic提示层归零:模型即协议的工程实践
2026/6/14 0:57:30

Anthropic提示层归零:模型即协议的工程实践

1. 项目概述:这不是一次普通更新,而是一次架构级“蒸发”“Anthropic Just Shipped the Layer That’s Already Going to Zero”——这个标题一出来,我正在调试一个Claude调用链的终端前停了三秒。不是因为震惊,而是因为熟悉&…

阅读更多
GIT修改用户名
2026/6/14 11:53:59

GIT修改用户名

在GIT中修改用户名可按以下步骤操作: 查看当前git的用户名,使用命令git config --list或git config user.name。修改git用户名,使用命令git config --global user.name "xxx(新的用户名)",将其中…

阅读更多
Win11Debloat:让你的Windows系统重获新生的终极优化工具
2026/6/13 15:45:46

Win11Debloat:让你的Windows系统重获新生的终极优化工具

Win11Debloat:让你的Windows系统重获新生的终极优化工具 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and …

阅读更多
技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践
2026/6/14 15:49:58

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践

技术深度解析:m4s-converter实现原理与B站缓存视频转换最佳实践 【免费下载链接】m4s-converter 一个跨平台小工具,将bilibili缓存的m4s格式音视频文件合并成mp4 项目地址: https://gitcode.com/gh_mirrors/m4/m4s-converter m4s-converter是一个…

阅读更多