Python元类是理解类创建机制的核心,本质是type——所有类(包括type自身)都是type的实例;类定义时元类通过__new__构造类对象、__init__初始化类,自定义元类需继承type并用metaclass关键字指定,且具有向子类传递的特性。
Python元类不是“高级技巧”,而是理解类如何被真正创建的关键。它回答一个问题:当你写下
,背后发生了什么?答案是——有一个“类的类”在干活,这个就是元类。
元类就是 type,type 就是元类
在 Python 中,所有类(包括
、
、你写的
)都是
的实例:
返回
也返回
—— 它自己造自己,这是 Python 类型系统的基石
所以
既是类型(type of types),也是默认元类(metaclass of classes)
类的创建分三步,元类全程参与
每次执行
语句,Python 实际做了三件事,元类的两个方法分别对应前两步:
__new__
:接收类名、父类元组、属性字典,负责“构造类对象”。你可以在这里修改命名空间、拦截非法定义
__init__
:对刚造好的类对象做初始化,比如打日志、注册到全局表、添加默认属性
(第三步是
__call__
,发生在实例化时,即
,它控制对象怎么被创建)
自定义元类必须继承 type
写一个元类,本质是写一个继承
的类,并重写
或
:
Python 3.14.3
微软官方的 Python 扩展,是 VS Code 安装量最高的扩展(209M+)。集成 IntelliSense(通过 Pylance)、调试(通过 Python Debugger)、代码检查、格式化、重构和单元测试等功能。支持 Jupyter Notebook、虚拟环境管理和多 Python 版本切换。
下载
立即学习
“
Python免费学习笔记(深入)
”;
不能直接用
或其他类作为基类,否则会报错
调用
是必须的,否则得不到真正的类对象
使用方式:
,注意是关键字参数,不是继承关系
元类行为具有传递性
如果父类指定了元类,它的所有子类(除非显式指定另一个元类)都会自动使用该元类:
这使得元类适合构建框架约束,比如强制所有模型类带
子类的
和
仍会被调用,你可以叠加逻辑
但要注意:元类不参与普通继承链(
),只影响类的创建过程
class MyClass:intstrMyClasstypeMyClass.__class__type.__class__typeclassMyClass()type__new____init__objectsuper().__new__class MyClass(metaclass=MyMeta):table_name__new____init____mro__