метакласс是一个听起来很吓人的东西,但实际上比我们想象的要简单得多。
类用于创建对象。
而 метакласс 则用于创建类。
例如,当你写:
class User:
pass
这个 User 类本身就是一个对象。Python 在创建它时使用了一种叫做 метакласс 的东西。
默认情况下,它使用的是 type:
print(type(User))
所以,type 实际上是类的构造器。
那么,为什么我们要使用 metaclass 呢?
实际上,99% 的程序员从来不会使用 metaclass——这没有问题。
但是像 Django、SQLAlchemy 和 Pydantic 这样的知名框架会使用它来:
- 为类添加一些额外的特性
- 在类创建时修改或检查类
- 自动注册子类
- 减少重复代码
metaclass 允许你在类被创建之前干预其创建过程。
一个非常简单的例子
这个 metaclass 会打印出每个被创建的类的名称:
class LoggerMeta(type):
def __new__(cls, name, bases, attrs):
print("Creating:", name)
return super().__new__(cls, name, bases, attrs)
使用:
class Example(metaclass=LoggerMeta):
pass
当文件执行时,它会打印:
创建:Example
因为元类在类本身之前执行。
自动添加属性
一个更实用的示例:
class InfoMeta(type):
def __new__(cls, name, bases, attrs):
attrs["source"] = "auto"
return super().__new__(cls, name, bases, attrs)
使用方法:
class Product(metaclass=InfoMeta):
pass
print(Product.source)
输出:
auto
什么时候应该使用 metaclass?
如果你正在编写一个普通的程序,几乎永远不需要!
metaclass 主要在你想控制类的构造方式时使用——通常是在构建框架、库或高级工具时。

