Dunder-методыФункция, привязанная к объекту и вызываемая через точку: text.upper(). — это как стандартные розетки в доме. Вы не задумываетесь, что внутри прибора: если у него стандартная вилка, он просто работает в любой розетке. Так и объектКонкретный экземпляр класса — со своими данными. Почти всё в Python является объектом.: если он «реализует стандартную розетку» __len__, то функцияИменованный блок кода, который можно вызывать многократно. Может принимать аргументы и возвращать результат.len() к нему подойдёт; реализует __eq__ — заработает оператор ==. Вы подключаете свой объект к встроенным возможностям языка через общие «разъёмы».
Dunder-методы (магические)
Методы вида __имя__ («dunder» — double underscore) Python вызывает автоматически в особых ситуациях. Они позволяют объектам вести себя как встроенные типы.
Метод
Когда вызывается
__init__
при создании объекта
__str__
при print(obj) / str(obj)
__repr__
при выводе в консоли / отладке
__eq__
при сравнении obj1 == obj2
__len__
при len(obj)
▶ dunder.py
@dataclass — классы без рутины
Часто классШаблон для создания объектов: описывает их данные (атрибуты) и поведение (методы). нужен просто чтобы хранить данные. Декоратор @dataclass автоматически создаёт __init__, __repr__ и __eq__ — не нужно писать их вручную.
▶ dataclass.py
💡Совет
@dataclass — любимый инструмент современных Python-разработчиков для «классов-данных». Меньше шаблонного кода, меньше ошибок. Используйте его, когда класс в основном хранит поля.
💡Совет
🔮 Предскажите вывод
__str__ вызывается при print(), а __eq__ — при сравнении ==. Что выведет код ниже?
▶ predict-dunder.py
Ответ — 100 руб., затем True. При print() Python зовёт __str__ и печатает красивую строкуТекстовое значение в кавычках: "привет". Неизменяема. По-английски string (str). вместо технического <Money object at 0x...>. А == вызывает __eq__, который сравнивает объекты по содержимому (rub), а не по адресу в памяти.
⚠️ Частые ошибки новичков
Частая ошибка — забыть __eq__ и удивляться, что два «одинаковых» объекта не равны. Без __eq__ Python сравнивает объекты по адресу в памяти, поэтому даже идентичные по данным экземпляры дают False. Запустите код и добавьте метод __eq__, чтобы сравнение шло по полю rub.
▶ broken-eq.py
Заданиерешение.py
Создайте класс Vector с атрибутами x, y. Реализуйте __add__(self, other), чтобы Vector(1,2) + Vector(3,4) возвращал Vector(4,6). Для сравнения добавьте __eq__.
Заданиерешение.py
Доп. задача. Используйте @dataclass. Создайте класс Book с полями title: str, pages: int. Добавьте метод is_long(), который возвращает True, если страниц больше 300.
❓Проверь себя
Что делает декоратор @dataclass?
Какой dunder-метод вызывается при print(obj)?
Почему два объекта с одинаковыми данными бывают не равны (==)?
ℹ️Важно
✅ Что вы узнали
Dunder-методы (__str__, __eq__, __add__…) — «стандартные розетки», подключающие объект к встроенным возможностям языка.
__str__ делает print() читаемым, __eq__ — сравнение по содержимому, __add__ — оператор +.
Без __eq__ объекты сравниваются по адресу в памяти.
@dataclass сам генерирует __init__, __repr__ и __eq__ — меньше рутинного кода.
Комментарии
Загрузка…
Загрузка комментариев…