Python元类(Metaclass)深度解析
请解释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
元类生命周期:
__new__:拦截类创建过程,可修改类定义(如添加方法、验证属性),返回新类对象__init__:类创建后初始化,接收(cls, name, bases, namespace)
应用场景:单例模式、ORM框架(如Django/SQLAlchemy的Model基类)、注册模式、API验证、自动添加方法等。
注意:Python 3中metaclass=Meta是标准写法。元类继承链:MyClass → Meta → type → object。