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 подскажет развёрнутый ответ в реальном времени.