Некорректное переопределение метода __len__

Подскажите, пожалуйста, почему метод __len__ выдаёт мне разные результаты для списков одинаковой длинны? И подскажите, ещё пожалуйста, как сделать так, чтобы после операции v1 = v + 5 v и v1 оставались отличными друг от друга. Потому что сейчас получается что при выводе на печать любого из этих экземпляров выводится одно и тоже. Заранее огромное спасибо!

class Vector:
    def __init__(self, *args):
        self.values = sorted([i for i in args if isinstance(i, int)])

    def __str__(self):
        return f'Вектор{tuple(self.values)}' if len(self.values) > 0 else 'Пустой вектор'

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

    def __add__(self, other):
        if isinstance(other, int):
            self.values = sorted([i + other for i in self.values])
            return f'Вектор{tuple(self.values)}' if len(self.values) > 0 else 'Пустой вектор'


v = Vector(1, 2, 4, -7.6, 8.2, 2, 0)
v1 = v + 5
print(len(v), len(v1))
print(v, v1)

Ответы (1 шт):

Автор решения: dIm0n

Потому что в методе __add__ вы возвращаете строку, а надо экзмепляр класса.

С минимальными изменениями:

class Vector:
    def __init__(self, *args):
        self.values = sorted([i for i in args if isinstance(i, int)])

    def __str__(self):
        return f'Вектор{tuple(self.values)}' if len(self.values) > 0 else 'Пустой вектор'

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

    def __add__(self, other):
        if isinstance(other, int):
            return Vector(*sorted([i + other for i in self.values]))


v = Vector(1, 2, 4, -7.6, 8.2, 2, 0)
v1 = v + 5
print(len(v), len(v1))
print(v, v1)
→ Ссылка