Middle
50
questionbank

Какие магические методы существуют в Python и для чего они используются?

Получайте ответы на вопросы в реальном времени с Sobes Copilot
Ответ от нейросети sobes.tech

Магические методы (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.