Чтобы класс не вызывал раздражения при использовании, он должен обладать тремя качествами:
1️⃣ Понятные аргументы: конструктор (`__init__`) принимает только то, что действительно нужно для создания объекта.
2️⃣ Красивое строковое представление: реализация метода
__repr__. Вместо <Point object at 0x...> вы должны видеть Point(x=1, y=2, z=3). Это критично для логирования и отладки.3️⃣ Логичное сравнение: реализация
__eq__. По умолчанию Python сравнивает объекты по адресу в памяти. В дружелюбном классе два объекта с одинаковыми данными должны быть равны (`p1 == p2`).⚡️ Dataclasses: дружелюбность «из коробки»
В современных версиях Python (3.7+) лучший способ создать дружелюбный класс — использовать декоратор
@dataclass. Он автоматически генерирует методы __init__, __repr__ и __eq__ за вас.
from dataclasses import dataclass
@dataclass
class Point:
x: float
y: float
z: float
Результат: вы написали 5 строк кода, но получили функционал, на который вручную ушло бы 15. Это экономит время и страхует от опечаток.
🛠 Когда можно быть «недружелюбным»?
➡️ Сравнение: Не нужно добавлять
__eq__ для объектов, у которых нет состояния (например, соединение с БД или логгер). Там важна идентичность объекта, а не равенство данных.➡️ Строковое представление: Если у объекта нет значимых данных для показа (например, итератор
enumerate`), стандартный `__repr__ вполне уместен.Если класс должен уметь что-то специфическое, используйте другие магические методы (dunder methods):
➡️
__iter__: позволит распаковывать объект как кортеж (`x, y, z = point`).➡️
__add__ / __sub__: если вы хотите складывать или вычитать объекты (например, векторы).Главный совет: Используйте
dataclasses как мерило. Если ваш обычный класс менее удобен, чем аналогичный @dataclass, значит, его пора «подружить» с пользователем.📍 Навигация: Вакансии • Задачи • Собесы
Библиотека питониста
#буст