Python元类入门教程_类的类工作原理

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

Python元类不是“高级技巧”,而是理解类如何被真正创建的关键。它回答一个问题:当你写下 class MyClass:,背后发生了什么?答案是——有一个“类的类”在干活,这个就是元类。

元类就是 type,type 就是元类

在 Python 中,所有类(包括 intstr、你写的 MyClass)都是 type 的实例:

  • MyClass.__class__ 返回
  • type.__class__ 也返回 —— 它自己造自己,这是 Python 类型系统的基石
  • 所以 type 既是类型(type of types),也是默认元类(metaclass of classes)

类的创建分三步,元类全程参与

每次执行 class 语句,Python 实际做了三件事,元类的两个方法分别对应前两步:

  • __new__:接收类名、父类元组、属性字典,负责“构造类对象”。你可以在这里修改命名空间、拦截非法定义
  • __init__:对刚造好的类对象做初始化,比如打日志、注册到全局表、添加默认属性
  • (第三步是 __call__,发生在实例化时,即 MyClass(),它控制对象怎么被创建)

自定义元类必须继承 type

写一个元类,本质是写一个继承 type 的类,并重写 __new____init__

  • 不能直接用 object 或其他类作为基类,否则会报错
  • 调用 super().__new__ 是必须的,否则得不到真正的类对象
  • 使用方式:class MyClass(metaclass=MyMeta):,注意是关键字参数,不是继承关系

元类行为具有传递性

如果父类指定了元类,它的所有子类(除非显式指定另一个元类)都会自动使用该元类:

  • 这使得元类适合构建框架约束,比如强制所有模型类带 table_name
  • 子类的 __new____init__ 仍会被调用,你可以叠加逻辑
  • 但要注意:元类不参与普通继承链(__mro__),只影响类的创建过程