Ответ
Магические методы, или "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__
— определяет "официальное" строковое представление объекта, полезное для отладки.
Магические методы позволяют создавать классы, которые ведут себя как встроенные типы данных, улучшая читаемость и выразительность кода.