В Python магические методы — это специальные методы, которые вы можете определить, чтобы добавить функциональность вашим классам. Их также называют dunder-методами из-за двойных подчеркиваний __ перед и после их имен. Вы уже знакомы с двумя из этих методов: __init__ и __str__. Посмотрите на простой пример:
class Circle:
def __init__(self, radius): # Инициализация объекта
self.radius = radius
def __str__(self): # Представление в виде строки
return f'Circle with radius {self.radius}'
c = Circle(5) # Создаем объект Circle с именем c
print(c) # Circle with radius 5
В этом примере мы определили два магических метода:
__init__ — это конструктор, который вызывается при создании экземпляра класса. Здесь он устанавливает радиус окружности.
__str__ определяет, как экземпляр класса должен быть преобразован в строку при использовании в контексте, таком как print().
Но это не единственные магические методы в Python. Их гораздо больше. Ниже представлены некоторые из них, которые позволяют экземплярам классов складываться с помощью + или сравниваться с помощью < или >:
class Circle:
def __init__(self, radius): # Инициализация объекта
self.radius = radius
def __str__(self): # Представление в виде строки
return f'Circle with radius {self.radius}'
def __add__(self, other): # Сложение двух окружностей
return Circle(self.radius + other.radius) # Возвращаем новую окружность
def __lt__(self, other): # Сравнение двух окружностей
return self.radius < other.radius # Сравниваем радиусы
c1 = Circle(5)
c2 = Circle(7)
c3 = c1 + c2 # Это создаст новую окружность с радиусом 12
print(c3) # Circle with radius 12
print(c1 < c2) # True
В данном случае:
__add__ позволяет нам использовать оператор + с экземплярами Circle. Он суммирует радиусы окружностей и возвращает новую окружность.
__lt__ (less than) позволяет нам сравнивать два экземпляра Circle с помощью оператора <. Он проверяет, меньше ли радиус первой окружности радиуса второй.
Магические методы делают наши классы в Python более выразительными и интуитивными, позволяя им вести себя подобно встроенным объектам Python.
Не забудьте сохранять специальное наименование с двойными подчеркиваниями, потому что интерпретатор Python ищет эти специально именованные методы для выполнения определенных операций. Вы можете найти список всех доступных магических методов в Python, перейдя по этой ссылке. Ниже перечислены некоторые из популярных магических методов:
Magic Method
Оператор
Описание
__eq__
==
Возвращает True, если self равен other.
__lt__
<
Возвращает True, если self меньше other.
__le__
<=
Возвращает True, если self меньше или равен other.
__gt__
>
Возвращает True, если self больше other.
__ge__
>=
Возвращает True, если self больше или равен other.
__add__(self, other)
+
Реализует сложение с оператором +.
__sub__(self, other)
-
Реализует вычитание с оператором -.
__mul__(self, other)
*
Реализует умножение с оператором *.
__truediv__(self, other)
/
Реализует деление с оператором /.
__floordiv__(self, other)
//
Реализует целочисленное деление с оператором //.
__mod__(self, other)
%
Реализует модуль с оператором %.
__pow__(self, other)
**
Реализует оператор возведения в степень **.
__abs__(self)
abs()
Реализует поведение для встроенной функции abs().
__round__(self, n)
round()
Реализует поведение для встроенной функции round().
__neg__(self)
-
Реализует отрицание с унарным оператором -.
💡
Обратите внимание, что не все методы имеют смысл для всех классов; реализуйте только те, которые полезны для вашей задачи.
Задание: Создайте класс Vector
Вам нужно определить класс Vector, который представляет трехмерный вектор с атрибутами x, y и z.
Класс должен включать реализацию специальных методов __add__, __sub__ и __mul__ для сложения векторов, вычитания и скалярного произведения соответственно.
Кроме того, реализуйте метод magnitude для вычисления длины вектора.
Требуемые методы:
__add__: Этот метод должен принимать другой объект Vector и возвращать новый Vector, который является результатом сложения компонентов x, y и z двух векторов.
__sub__: Этот метод должен принимать другой объект Vector и возвращать новый Vector, который является результатом вычитания компонентов x, y и z второго вектора из первого.
__mul__: Этот метод должен принимать другой объект Vector и возвращать скалярное произведение двух векторов, вычисляемое как $$(x1 \cdot x2) + (y1 \cdot y2) + (z1 \cdot z2)$$.
magnitude: Этот метод должен возвращать длину (модуль) вектора, вычисляемую как $$\sqrt{x^2 + y^2 + z^2}$$.