Это когда класс наследуется от нескольких родителей. Не самый частый, но мощный инструмент!
📚 Часть 1: Простой пример
🎯 Главный кейс — миксины (примеси) — классы, которые добавляют одну конкретную фичу другим классам.
👉 Простой пример:
class Goods: # Товары
def __init__(self, name, weight, price):
super().__init__() # 🔑 ключевой момент!
self.name = name
self.weight = weight
self.price = price
def print_info(self):
print(f"{self.name}, {self.weight}, {self.price}")
class MixinLog:
ID = 0
def __init__(self):
super().__init__() # здесь для примера
MixinLog.ID += 1
self.id = MixinLog.ID
def save_sell_log(self):
print(f"Товар с id={self.id} был продан в {datetime.now()}")
# Множественное наследование
class Notebook(Goods, MixinLog):
pass
n = Notebook('Acer', 1.5, 30000)
n.print_info() # Acer, 1.5, 30000
n.save_sell_log() # ✅ работает!
Что происходит?
1. Создаем Notebook → вызывается Goods.init
2 . super().init() в Goods передает управление MixinLog.init
3. Оба инициализатора выполняются
🧠 Как работает super()?
Раньше, уже думаю, ее видели и понимаете что она делает. Я тоже так думал, но оказалось не совсем верно понимал🫣
Оказывается super() возвращает не просто "родительский класс", а следующий класс в MRO (Method Resolution Order) — порядке обхода классов при наследовании.
👉 Цепочка вызовов в данном примере:
1. Notebook() → Goods.init()
2. super().init() в Goods вызывает MixinLog.init()
3. super().init() в MixinLog вызывает object.init()
4. Все инициализаторы выполнены!
🔍 Важно: порядок имеет значение!
Порядок наследования (Goods, MixinLog) определяет MRO (Method Resolution Order):
print(Notebook.__mro__)
# (<class '__main__.Notebook'>,
# <class '__main__.Goods'>,
# <class '__main__.MixinLog'>,
# <class 'object'>)
💎 Правила для миксинов:
1. Делайте их максимально простыми и узкоспециализированными
2. Всегда вызывайте super().init() в init
3. Ставьте миксины после основного класса в наследовании
🎯 Зачем это нужно?
• Переиспользование кода без дублирования
• Гибкое расширение функциональности
• Чистая архитектура (разделение ответственности)
📌 Итог:
Миксины — это как LEGO для классов. Добавляйте готовые блоки функциональности, не ломая основную логику!
А вы использовали множественное наследование или миксины на практике? 👇