Миксины — это особый вид классов в Python, предназначенный для предоставления методов другим классам без необходимости становиться их родительским классом в традиционном понимании.
Миксины — это:
class JsonSerializableMixin:
"""Миксин для добавления JSON-сериализации"""
def to_json(self):
import json
return json.dumps(self.__dict__)
class XmlSerializableMixin:
"""Миксин для добавления XML-сериализации"""
def to_xml(self):
from xml.etree.ElementTree import Element, tostring
el = Element(self.__class__.__name__)
for key, value in self.__dict__.items():
child = Element(key)
child.text = str(value)
el.append(child)
return tostring(el)
class Person(JsonSerializableMixin, XmlSerializableMixin):
"""Класс, использующий миксины"""
def __init__(self, name, age):
self.name = name
self.age = age
# Использование
p = Person("Alice", 30)
print(p.to_json()) # Метод из JsonSerializableMixin
print(p.to_xml()) # Метод из XmlSerializableMixin
class LoggingMixin:
"""Добавляет логирование операций"""
def log(self, message):
print(f"[LOG] {self.__class__.__name__}: {message}")
class DatabaseModel(LoggingMixin):
def save(self):
self.log("Saving to database")
# Реальная логика сохранения
class ComparableMixin:
"""Добавляет операторы сравнения"""
def __eq__(self, other):
return self.__dict__ == other.__dict__
class HashableMixin:
"""Добавляет хеширование"""
def __hash__(self):
return hash(tuple(sorted(self.__dict__.items())))
class ValueObject(ComparableMixin, HashableMixin):
"""Неизменяемый объект-значение"""
pass
class UpperCaseMixin:
"""Преобразует строковые атрибуты в верхний регистр"""
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
for name, value in self.__dict__.items():
if isinstance(value, str):
setattr(self, name, value.upper())
class Product(UpperCaseMixin):
def __init__(self, name, description):
self.name = name
self.description = description
prod = Product("laptop", "portable computer")
print(prod.name) # "LAPTOP"
Критерий | Обычное наследование | Миксины |
---|---|---|
Назначение | Выражение "is-a" отношения | Добавление функциональности |
Иерархия | Вертикальная | Горизонтальная |
Использование | Основная логика | Вспомогательные методы |
Зависимости | Могут быть сложными | Минимальные |
class MyClass(MixinA, MixinB, BaseClass):
"""Правильный порядок: миксины идут первыми"""
pass
Миксины особенно полезны когда нужно: