Магические методы (magic methods) в Python, также известные как dunder методы (от double underscore - двойное подчеркивание), помечаются двойным подчеркиванием в начале и конце имени (например, __init__, __str__). Они используются для реализации операторной перегрузки и настройки поведения объектов при взаимодействии со встроенными функциями и синтаксическими конструкциями Python.
Основные категории и примеры магических методов:
Инициализация и создание объектов:
__new__(cls, ...): Создает экземпляр класса. Вызывается до __init__.__init__(self, ...): Инициализирует экземпляр класса после его создания.__del__(self): Деструктор. Вызывается при удалении объекта.Представление объектов:
__str__(self): Возвращает "неофициальное" строковое представление объекта, удобное для пользователей. Используется функциями str() и print().__repr__(self): Возвращает "официальное" строковое представление объекта, однозначное и удобное для разработчиков (часто в виде кода, который может воссоздать объект). Используется функциями repr() и при отображении объектов в интерактивной консоли.Атрибутный доступ:
__getattr__(self, name): Вызывается, когда попытка получить доступ к атрибуту name, которого нет в объекте или его классах-предках.__setattr__(self, name, value): Вызывается при присваивании значения атрибуту name.__delattr__(self, name): Вызывается при удалении атрибута name.__getattribute__(self, name): Вызывается при каждой попытке доступа к атрибуту, независимо от того, существует ли он.Вызываемость объекта:
__call__(self, ...): Позволяет экземпляру класса вести себя как функция.Контейнерные протоколы:
__len__(self): Возвращает длину контейнера. Используется функцией len().__getitem__(self, key): Реализует доступ по индексу или ключу (например, obj[key]).__setitem__(self, key, value): Реализует присваивание по индексу или ключу (например, obj[key] = value).__delitem__(self, key): Реализует удаление по индексу или ключу (например, del obj[key]).__iter__(self): Возвращает итератор для объекта. Используется в цикле for.__next__(self): Используется итераторами для получения следующего элемента.Операторы сравнения:
__eq__(self, other): Равно (==).__ne__(self, other): Не равно (!=).__lt__(self, other): Меньше (<).__le__(self, other): Меньше или равно (<=).__gt__(self, other): Больше (>).__ge__(self, other): Больше или равно (>=).Арифметические операторы:
__add__(self, other): Сложение (+).__sub__(self, other): Вычитание (-).__mul__(self, other): Умножение (*).__truediv__(self, other): Истинное деление (/).__floordiv__(self, other): Целочисленное деление (//).__mod__(self, other): Остаток от деления (%).__pow__(self, other): Возведение в степень (**).__radd__, __rsub__, и т.д.) для случаев, когда операнды имеют разные типы.Пример использования __str__ и __repr__:
python
Пример использования __len__ и __getitem__:
python
Магические методы позволяют создавать объекты с поведением, аналогичным встроенным типам данных, делая код более идиоматичным и читаемым. Они являются основой протоколов в Python.