Магические методы

В 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 для вычисления длины вектора.

3d-vector.webp

Требуемые методы:

  • __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}$$.

Input

Output

v1 = Vector(1, 2, 3); v2 = Vector(4, 5, 6); v3 = v1 + v2; v4 = v1 - v2; print(v1 * v2); print(v1.magnitude()); v4 = Vector(-3, -3, -3)

32
3.74165

Constraints

Time limit: 2 seconds

Memory limit: 512 MB

Output limit: 1 MB

To check your solution you need to sign in
Sign in to continue