Ответ
Метакласс в Python — это «класс для класса». Он определяет, как создаётся сам класс, точно так же, как обычный класс определяет, как создаются его экземпляры (объекты).
По умолчанию в Python метаклассом для всех классов является type. Создавая собственный метакласс, вы перехватываете процесс создания класса (__new__) и можете изменить его до того, как он будет окончательно сформирован.
Основные сценарии использования:
- Автоматическая регистрация классов: Например, для создания реестра плагинов, ORM-моделей или сериализаторов. При определении нового класса метакласс может автоматически добавить его в глобальный словарь.
- Валидация структуры класса: Проверка на наличие обязательных методов или атрибутов при создании класса.
- Модификация класса: Автоматическое добавление или изменение методов и атрибутов во всех классах, использующих данный метакласс.
Пример: метакласс, требующий наличия атрибута __tablename__
# Определяем метакласс, наследуясь от type
class ModelMeta(type):
def __new__(cls, name, bases, dct):
# cls: сам метакласс (ModelMeta)
# name: имя создаваемого класса ('User')
# bases: кортеж базовых классов
# dct: словарь атрибутов и методов класса
if '__tablename__' not in dct:
raise TypeError(f"Класс {name} должен определять атрибут '__tablename__'")
# Вызываем __new__ родительского метакласса (type), чтобы создать класс
return super().__new__(cls, name, bases, dct)
# Используем метакласс
class User(metaclass=ModelMeta):
__tablename__ = 'users'
id: int
name: str
# Этот код вызовет ошибку TypeError, так как атрибут отсутствует
# class Order(metaclass=ModelMeta):
# order_id: int
Метаклассы — это мощный, но сложный инструмент. В большинстве случаев их можно заменить более простыми механизмами, такими как декораторы классов или наследование.