Суммирование перегрузки - PullRequest
0 голосов
/ 18 ноября 2018

Я хочу суммирование 3 различных объектов, таких как:

`2 3 4
 2 3 4
 2 3 4  
 6 9 12`the summation must be like this 

И попытался это сделать

`

class mymath:
    def __init__(self,x,y,z):
        self.x=x
        self.y=y
        self.z=z        
    def __add__(self,other):
        return self.x+other.x, self.y+other.y, self.z+other.z
x=mymath(2,7,6)
y=mymath(4,3,8)
z=mymath(2,4,6)
print(x+y+z)

1 Ответ

0 голосов
/ 19 ноября 2018

Вы возвращаете кортеж, у которого метод __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>.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...