Python元类是理解类创建机制的核心,本质是type——所有类(包括type自身)都是type的实例;类定义时元类通过__new__构造类对象、__init__初始化类,自定义元类需继承type并用metaclass关键字指定,且具有向子类传递的特性。

Python元类不是“高级技巧”,而是理解类如何被真正创建的关键。它回答一个问题:当你写下 class MyClass:,背后发生了什么?答案是——有一个“类的类”在干活,这个就是元类。
元类就是 type,type 就是元类
在 Python 中,所有类(包括 int、str、你写的 MyClass)都是 type 的实例:
-
MyClass.__class__返回 -
type.__class__也返回—— 它自己造自己,这是 Python 类型系统的基石 - 所以
type既是类型(type of types),也是默认元类(metaclass of classes)
类的创建分三步,元类全程参与
每次执行 class 语句,Python 实际做了三件事,元类的两个方法分别对应前两步:
- __new__:接收类名、父类元组、属性字典,负责“构造类对象”。你可以在这里修改命名空间、拦截非法定义
- __init__:对刚造好的类对象做初始化,比如打日志、注册到全局表、添加默认属性
- (第三步是 __call__,发生在实例化时,即
MyClass(),它控制对象怎么被创建)
自定义元类必须继承 type
写一个元类,本质是写一个继承 type 的类,并重写 __new__ 或 __init__:
使用模板与程序分离的方式构建,依靠专门设计的数据库操作类实现数据库存取,具有专有错误处理模块,通过 Email 实时报告数据库错误,除具有满足购物需要的全部功能外,成新商城购物系统还对购物系统体系做了丰富的扩展,全新设计的搜索功能,自定义成新商城购物系统代码功能代码已经全面优化,杜绝SQL注入漏洞前台测试用户名:admin密码:admin888后台管理员名:admin密码:admin888
立即学习“Python免费学习笔记(深入)”;
- 不能直接用
object或其他类作为基类,否则会报错 - 调用
super().__new__是必须的,否则得不到真正的类对象 - 使用方式:
class MyClass(metaclass=MyMeta):,注意是关键字参数,不是继承关系
元类行为具有传递性
如果父类指定了元类,它的所有子类(除非显式指定另一个元类)都会自动使用该元类:
- 这使得元类适合构建框架约束,比如强制所有模型类带
table_name - 子类的
__new__和__init__仍会被调用,你可以叠加逻辑 - 但要注意:元类不参与普通继承链(
__mro__),只影响类的创建过程









