Hardmetaclass
Что такое метаклассы в Python?
1Постановка
Разберём, что от вас хотят в этом вопросе и как к нему подступиться на собеседовании.
2Решение
Метакласс — «класс класса», контролирует создание классов. По умолчанию type. class Foo: pass эквивалентно Foo = type('Foo', (), {}).
class Meta(type):
def __new__(mcs, name, bases, namespace):
cls = super().__new__(mcs, name, bases, namespace)
cls.custom_attr = 'added' # можно изменять namespace до создания
return cls
class MyClass(metaclass=Meta):
pass
MyClass.custom_attr # 'added'
# __init_subclass__ (Python 3.6) — упрощённая альтернатива
class Base:
def __init_subclass__(cls, **kw):
super().__init_subclass__(**kw)
print(f'{cls.__name__} created')Применения: ORM (Django models через ModelBase), ABC (ABCMeta), registration (плагины), enum.Enum.
- На практике в прикладном коде редко нужно — обычно декораторы,
__init_subclass__илиdataclassпроще; - Эталонный пример — Django models:
ModelBaseобрабатывает поля, создает_meta.
3Как отвечать
- Сначала уточните условия и ограничения, покажите аналитическое мышление.
- Рассуждайте вслух — интервьюеру важен ход мысли, а не только финальный ответ.
- Оцените сложность по времени и памяти (Big-O), если это алгоритмический вопрос.
💡
На реальном собеседовании Alffert подскажет развёрнутый ответ в реальном времени.