В ООП миксины — это инструмент, который позволяет переиспользовать общую функциональность между несколькими, часто несвязанными типами данных. Это шаг в сторону гибкого модульного кода с минимальной связностью похожих объектов.
В отличие от других ЯП (Ruby, Dart и проч.), которые поддерживают этот паттерн явно через специализированный синтаксис, Python полагается на множественное наследование как на механизм для реализации этой концепции.
Представьте, что вы создаете классы
Animal и Vehicle с различными форматами данных. Реализация одной и той же функции serialize() приводит к дублированию кода:
# Плохо: Дублирование кода
class Animal:
def __init__(self, name, species):
self.name = name
self.species = species
def serialize(self) -> dict:
return vars(self)
class Vehicle:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
def serialize(self) -> dict: # Дублирование!
return vars(self)
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def serialize(self) -> dict: # Дублирование!
return vars(self)
Решение через примеси:
# Миксин обычно предоставляет одну конкретную функцию
class SerializableMixin:
def serialize(self) -> dict:
if hasattr(self, "__slots__"):
return {
name: getattr(self, name)
for name in self.__slots__
}
else:
return vars(self)
# Классы используют mixin без странной иерархии
class Animal:
def __init__(self, name, species):
self.name = name
self.species = species
class Vehicle:
def __init__(self, make, model, year):
self.make = make
self.model = model
self.year = year
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
# Применяем mixin к нужным классам
class SerializableAnimal(Animal, SerializableMixin):
pass
class SerializableVehicle(Vehicle, SerializableMixin):
pass
class SerializablePerson(Person, SerializableMixin):
pass
Когда использовать Mixins
1️⃣ Когда нужно переиспользовать функциональность между несвязанными классами
2️⃣ Когда нужно создать модульный и композируемый код
3️⃣ Когда нужно расширить функциональность сторонних библиотек
Когда НЕ стоит использовать Mixins
1️⃣ Когда функциональность специфична для одного класса
2️⃣ Когда создается слишком сложная иерархия наследования
#основы
@zen_of_python
🤓 — Если изучил досконально