Назад к вопросам
Middle
68
questionbank
Какие методы __add__, __mul__, __sub__ и __truediv__ вы знаете и как их можно использовать в Python?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
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}")