首页 论坛 置顶 Python中的元类介绍

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 作者
    帖子
  • #27669

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

    类用于创建对象。

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

    例如,当你写:

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

正在查看 1 个帖子:1-1 (共 1 个帖子)
  • 哎呀,回复话题必需登录。