Sobes.tech
Middle
164

Kuras __add__, __mul__, __sub__ un __truediv__ metodes jūs zināt un kā tos var izmantot Python?

Atbilde no AI

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}")