Python中的元类介绍

метакласс是一个听起来很吓人的东西,但实际上比我们想象的要简单得多。

类用于创建对象。

而 метакласс 则用于创建类。

例如,当你写:

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 主要在你想控制类的构造方式时使用——通常是在构建框架、库或高级工具时。

更多