Что такое миксин и для чего он используется в иерархии классов Python
Что проверяют
Понимаете ли вы, что миксин добавляет поведение, а не сущность, и знаете ли, как работает порядок разрешения методов.
Как отвечать
Миксин это класс, который не предназначен для самостоятельного использования и не описывает сущность. Он добавляет одну конкретную способность классам, которые его подмешивают.
class TimestampMixin:
def touch(self) -> None:
self.updated_at = datetime.now(UTC)
class JsonMixin:
def to_json(self) -> str:
return json.dumps(self.__dict__, default=str)
class Job(TimestampMixin, JsonMixin, Base): ...Отличие от обычного базового класса: миксин не отвечает на вопрос «что это», он отвечает на вопрос «что оно умеет». Job это вакансия, а не «отметка времени», поэтому наследование здесь горизонтальное, а не иерархическое.
Что важно знать про механику: множественное наследование в Python разрешается по MRO (алгоритм C3), порядок виден в Class.__mro__. Миксины ставят левее основного базового класса, потому что поиск идёт слева направо, и иначе их методы будут перекрыты. Кооперативные миксины вызывают super() в своих методах, чтобы цепочка не обрывалась.
Где это встречается в реальном коде: LoginRequiredMixin в Django, миксины представлений в DRF, примеси для сериализации и логирования.
Альтернатива: протокол плюс композиция. Если поведение не требует доступа к состоянию класса, часто чище передать объект, чем подмешивать класс.
Где спотыкаются
Делают миксин с собственным состоянием и конструктором, из-за чего он превращается в обычный базовый класс.
Ставят миксин правее базового и не понимают, почему метод не вызывается.
Не вызывают super() и обрывают цепочку в кооперативном наследовании.
Подмешивают пять миксинов и получают иерархию, в которой невозможно найти, откуда пришёл метод.