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

Ответ

Магические методы, или "dunder-методы" (от "double underscore"), в Python — это специальные методы, имена которых начинаются и заканчиваются двойным подчеркиванием (например, __init__, __str__, __add__). Они позволяют переопределять встроенное поведение объектов и реализовывать операторную перегрузку.

Почему они важны? Магические методы дают возможность классам взаимодействовать с базовыми операциями Python (сложение, сравнение, вызов функций, строковое представление) естественным образом, делая код более интуитивным и "питоническим".

Пример использования: Рассмотрим класс Vector, который поддерживает сложение и строковое представление:

class Vector:
    def __init__(self, x: int, y: int):
        """Инициализация вектора."""
        self.x = x
        self.y = y

    def __add__(self, other: 'Vector') -> 'Vector':
        """Перегрузка оператора сложения (+)."""
        if not isinstance(other, Vector):
            raise TypeError("Можно складывать только с другим вектором.")
        return Vector(self.x + other.x, self.y + other.y)

    def __str__(self) -> str:
        """Строковое представление объекта для пользователя (print())."""
        return f"Vector({self.x}, {self.y})"

    def __repr__(self) -> str:
        """Официальное строковое представление для разработчика (отладка)."""
        return f"Vector(x={self.x}, y={self.y})"

# Использование
v1 = Vector(2, 3)
v2 = Vector(4, 5)

v3 = v1 + v2  # Вызывает __add__
print(f"Сумма векторов: {v3}") # Вызывает __str__ -> Сумма векторов: Vector(6, 8)
print(f"Представление для отладки: {repr(v3)}") # Вызывает __repr__ -> Представление для отладки: Vector(x=6, y=8)

В этом примере:

  • __init__ — конструктор, инициализирует объект.
  • __add__ — позволяет складывать объекты Vector с помощью оператора +.
  • __str__ — определяет, как объект будет преобразован в строку для пользователя (например, при print()).
  • __repr__ — определяет "официальное" строковое представление объекта, полезное для отладки.

Магические методы позволяют создавать классы, которые ведут себя как встроенные типы данных, улучшая читаемость и выразительность кода.