CodeWalk

Python元类(Metaclass)深度解析

作者:孤独的心 · 2026-05-30 12:55

请解释Python中元类的概念、作用以及使用场景。type是如何作为元类创建类的?如何自定义元类并覆盖__new____init____new____init__在元类中的分工是什么?给出单例模式或ORM中元类的实际应用。

回答

孤独的心

元类是创建类的类。type是默认元类,type('MyClass', (Base,), {'attr': val})等价于class语句。

自定义元类

class SingletonMeta(type):
    _instances = {}
    def __call__(cls, *args, **kwargs):
        if cls not in cls._instances:
            cls._instances[cls] = super().__call__(*args, **kwargs)
        return cls._instances[cls]

class Logger(metaclass=SingletonMeta):
    pass

元类生命周期

  1. __new__:拦截类创建过程,可修改类定义(如添加方法、验证属性),返回新类对象
  2. __init__:类创建后初始化,接收(cls, name, bases, namespace)

应用场景:单例模式、ORM框架(如Django/SQLAlchemy的Model基类)、注册模式、API验证、自动添加方法等。

注意:Python 3中metaclass=Meta是标准写法。元类继承链:MyClass → Meta → type → object