Ответ
Метакласс в Python — это «класс для класса». Он определяет, как создается сам класс, а не его экземпляры. Проще говоря, если класс — это 'чертеж' для создания объектов, то метакласс — это 'чертеж' для создания самих 'чертежей' (классов).
По умолчанию в Python метаклассом для всех классов является type.
Как это работает?
Метаклассы позволяют перехватить процесс создания класса (__new__, __init__) и модифицировать его: добавить/удалить атрибуты, методы, провести валидацию и т.д.
Пример: автоматическое добавление атрибута
# Определяем метакласс, наследуясь от type
class VersionedMeta(type):
# __new__ метакласса вызывается при создании нового класса
def __new__(cls, name, bases, dct):
# Добавляем атрибут 'version' в словарь атрибутов будущего класса
dct['version'] = '1.0'
print(f"Creating class {name} with attributes {dct}")
# Создаем класс с помощью родительского __new__
return super().__new__(cls, name, bases, dct)
# Применяем метакласс к нашему классу
class Game(metaclass=VersionedMeta):
author = 'dev'
# Теперь у класса Game есть атрибут 'version'
print(Game.version) # Вывод: 1.0
Когда их следует использовать?
Метаклассы — мощный, но сложный инструмент. Их применяют, когда более простые подходы (наследование, декораторы) не подходят.
- Создание API и фреймворков: Django использует метаклассы для создания моделей ORM (автоматическое создание полей таблицы из атрибутов класса).
- Автоматическая регистрация классов: Например, для регистрации плагинов или обработчиков.
- Валидация структуры класса: Проверка наличия определенных методов или атрибутов при создании класса.
Важно: В большинстве прикладных задач можно обойтись без метаклассов, используя декораторы классов или фабричные функции.