Sobes.tech
Middle
97
questionbank

Какие методы __add__, __mul__, __sub__ и __truediv__ вы знаете и как их можно использовать в Python?

Ответ от нейросети

sobes.tech AI

Это специальные "магические" или "дандем" методы, используемые для перегрузки операторов. Они позволяют объектам класса вести себя как стандартные числовые типы при выполнении арифметических операций.

  • __add__(self, other): Перегрузка оператора +. Вызывается при сложении объектов (self + other).
  • __mul__(self, other): Перегрузка оператора *. Вызывается при умножении объектов (self * other).
  • __sub__(self, other): Перегрузка оператора -. Вызывается при вычитании объектов (self - other).
  • __truediv__(self, other): Перегрузка оператора /. Вызывается при "истинном" делении объектов (self / other), возвращающем результат типа float.

Пример использования в классе Vector:

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y

    def __add__(self, other):
        # Сложение двух векторов
        if isinstance(other, Vector):
            return Vector(self.x + other.x, self.y + other.y)
        # Сложение вектора с числом (умножение на скаляр)
        elif isinstance(other, (int, float)):
            return Vector(self.x + other, self.y + other)
        else:
            return NotImplemented # Указывает, что операция не поддерживается для данного типа

    def __mul__(self, other):
        # Умножение вектора на скаляр
        if isinstance(other, (int, float)):
            return Vector(self.x * other, self.y * other)
        # Скалярное произведение двух векторов
        elif isinstance(other, Vector):
            return self.x * other.x + self.y * other.y
        else:
            return NotImplemented

    def __sub__(self, other):
        # Вычитание вектора
        if isinstance(other, Vector):
            return Vector(self.x - other.x, self.y - other.y)
        # Вычитание числа
        elif isinstance(other, (int, float)):
            return Vector(self.x - other, self.y - other)
        else:
            return NotImplemented

    def __truediv__(self, other):
        # Деление вектора на скаляр
        if isinstance(other, (int, float)) and other != 0:
            return Vector(self.x / other, self.y / other)
        else:
            return NotImplemented # Деление на ноль или нечисловой тип не поддерживается

    def __str__(self):
        return f"Vector({self.x}, {self.y})"

# Примеры использования:
v1 = Vector(1, 2)
v2 = Vector(3, 4)

sum_vector = v1 + v2 # Вызывает v1.__add__(v2)
print(f"v1 + v2 = {sum_vector}")

scaled_vector = v1 * 5 # Вызывает v1.__mul__(5)
print(f"v1 * 5 = {scaled_vector}")

diff_vector = v2 - v1 # Вызывает v2.__sub__(v1)
print(f"v2 - v1 = {diff_vector}")

divided_vector = v1 / 2.0 # Вызывает v1.__truediv__(2.0)
print(f"v1 / 2.0 = {divided_vector}")

dot_product = v1 * v2 # Вызывает v1.__mul__(v2)
print(f"v1 * v2 (скалярное произведение) = {dot_product}")