Вы возвращаете кортеж, у которого метод __add__()
не перегружен.Вместо этого вы должны вернуть объект mymath
:
class mymath:
def __init__(self, x, y, z):
self.x = x
self.y = y
self.z = z
def __add__(self, other):
return mymath(self.x + other.x, self.y + other.y, self.z + other.z)
def __str__(self):
return "({}, {}, {})".format(self.x, self.y, self.z)
x = mymath(2, 7, 6)
y = mymath(4, 3, 8)
z = mymath(2, 4, 6)
print(x + y + z) # Result: (8, 14, 20)
Редактировать: пояснение решения добавлено после комментария
Каждый знак +
преобразуется в __add__()
вызов.В вашем примере операция x + y + z
фактически выполняет два вызова __add__()
: x.__add__(y).__add__(z)
.
Добавление скобок в выражение может помочь: x + y + z
фактически переводит в (x.__add__(y)).__add__(z)
.
Проблема возникает во втором вызове __add__()
, так как ваш метод возвращает self.x + other.x, self.y + other.y, self.z + other.z
который является кортежем (self.x + other.x, self.y + other.y, self.z + other.z)
(вы можете опустить скобки в вашем коде, и он более питонический, но он эквивалентен и на самом деле это кортеж).
Кортеж - это список элементов фиксированной длины, и онбазовый класс языка Python.Вы можете прочитать больше об этом здесь .
Результат x.__add__(y)
- это сумма, которую вы ожидаете получить от x + y
, но типа tuple
.В этом примере (6, 10, 14) == (2 + 4, 7 + 3, 6 + 8)
Вы можете проверить это, запустив свой код, но напечатав только x + y
print(x + y) # Prints (6, 10, 14)
А также:
print(type(x + y)) # Prints <class 'tuple'>
Второе дополнениеТем не менее, происходит сбой, потому что результатом первого является кортеж, а не объект mymath
.Таким образом, (x + y) + z
на самом деле вызывает метод __add__()
кортежа, который существует, но имеет другое значение, чем тот, который вы хотите.Таким образом, вы получаете ошибку TypeError: can only concatenate tuple (not "mymath") to tuple
Обратите внимание, что добавление двух кортежей - это просто добавление их, а не добавление координат по элементам: (1, 2, 3) + (4, 5, 6) ==> (1, 2, 3, 4, 5, 6)
Решение этой проблемы состоит в том, чтобывернуть объект mymath
в результате операции __add__()
, что позволяет объединить более одной операции сложения.
Я добавил метод __str__()
в ваш класс, потому что в противном случае печать просто показывает представление класса по умолчанию, например <__main__.mymath object at 0x7f8654657390>
.