Метаклассы в Python — это классы, которые создают другие классы. Если класс — это шаблон для объектов, то метакласс — это шаблон для создания классов. Благодаря им можно программно определять как создаются и изменяются классы.
В Python всё — объект, в том числе и классы. Это позволяет определить логику создания, модификации и контроля классов на этапе их генерации. Подобные механизмы уже использовались в других языках, но в Python они реализованы особенно просто и элегантно через механизм метаклассов.
Иногда в больших проектах классы должны строиться по особым правилам или включать обязательные методы, свойства, или автоматически модифицироваться при их определении. Без метаклассов это привело бы к дублированию кода и распространению ошибок.
Метаклассы позволяют модифицировать создание классов с помощью переопределения методов класса type, например new и init. Можно автоматически добавлять методы, свойства, валидировать структуру, применять рефлексию.
class UpperAttrMeta(type): def __new__(cls, name, bases, dct): new_attrs = {} for key, value in dct.items(): if not key.startswith('__'): new_attrs[key.upper()] = value else: new_attrs[key] = value return super().__new__(cls, name, bases, new_attrs) class Foo(metaclass=UpperAttrMeta): bar = 'bip' print(hasattr(Foo, 'bar')) # False print(hasattr(Foo, 'BAR')) # True
metaclass в объявлении классаМожно ли изменить метакласс экземпляра после создания класса? Нет. После создания класса его метакласс изменить нельзя без перегенерации самого класса. Экземпляр использует метакласс, определённый у его класса.
Чем метаклассы отличаются от декораторов классов? Декораторы классов могут изменить класс уже после его создания, а метаклассы управляют самим процессом создания и могут даже запретить создание класса или изменить его базовые классы.
Должен ли каждый класс иметь собственный метакласс?
Нет. Обычно используют стандартный type, метакласс нужен лишь когда необходимо нарушить поведение по умолчанию.
Плюсы:
Негативный кейс: Начинающий архитектор стал использовать метаклассы для простых задач (например, автогенерация str), вместо декораторов. Плюсы: освоил новый инструмент. Минусы: нагрузил команду лишней магией, появились баги.
Положительный кейс: В сложной ORM использовали метакласс для автогенерации таблиц на основе классов Python. Плюсы: централизованный контроль структуры, автоматическое обновление маппингов. Минусы: потребовалось подробное документирование и обучение новых участников команды.