Python: использовать функцию с аргументом настроенного объекта класса итерации, выводится нежелательный результат - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь настроить свой собственный класс для итерации и пытаюсь включить его в вычисления:

class Iteration:
    def __init__(self, array):
        self.array = array

    def __pow__(self, power, modulo=None):
        new_array = list()
        for i in self.array:
            new_array.append(i ** power)
        return new_array

    def __len__(self):
        return len(self.array)

    def __getitem__(self, indices):
        return self.array[indices]


def mul(x):
    return x ** 2 + 3 * x ** 3


it = Iteration([1, 2, 3])

print(mul(2))   #=> 28
print(mul(it))  #=> [1, 4, 9, 1, 8, 27, 1, 8, 27, 1, 8, 27]

, почему mul (it) объединил перегруженный результат? Как я могу решить это? Я хочу: print (mul (it)) # => [4, 28, 90]

1 Ответ

2 голосов
/ 01 апреля 2020

Ваш __pow__ возвращает список, а не Iteration экземпляр. Операции + и * являются операциями списков, и списки реализуют + и * как конкатенацию и повторение.

[1, 4, 9] + 3 * [1, 8, 27] повторяется [1, 8, 27] 3 раза, чтобы получить [1, 8, 27, 1, 8, 27, 1, 8, 27], затем объединяет [1, 4, 9] и [1, 8, 27, 1, 8, 27, 1, 8, 27].

Вам необходимо вернуть экземпляр Iteration из __pow__, и вам также нужно реализовать __add__ и __mul__, а не только __pow__. Пока вы работаете над этим, вы также можете реализовать __str__ или __repr__, чтобы при печати вы могли видеть данные, которые обертывает ваш объект Iteration.

...