Дописать класс так что бы он был callable

10. Дописать класс так что бы он был callable

Условие задачи:
Дописать объект (класс), чтобы сигнатура вызовов позволяла выполнять следующее

customsum(1) # 1
customsum(1)(2) # 3
customsum(1)(-2)(3) # 2

s = customsum(1)
s(2)
s(3)
print(11 + int(s)) # 17
Спойлеры к решению
Подсказки
  • Нужно сделать объект, который можно вызывать как функцию.
  • Для этого в классе используется метод __call__.
  • Внутри объекта нужно хранить текущую сумму.
  • При каждом новом вызове нужно прибавлять новое число к текущей сумме.
  • Чтобы работал int(s), нужно реализовать метод __int__.
  • Чтобы в консоли объект выглядел как число, можно добавить __repr__ и __str__.
Решение
class сustomsum:
    def __init__(self, value: int):
        self.total = value

    def __call__(self, value: int):
        self.total += value
        return self

    def __int__(self):
        return self.total

    def __repr__(self):
        return str(self.total)

    def __str__(self):
        return str(self.total)

Пример использования:

print(customsum(1))           # 1
print(customsum(1)(2))        # 3
print(customsum(1)(-2)(3))    # 2

s = customsum(1)
s(2)
s(3)

print(11 + int(s))            # 17

Объект работает за счёт метода __call__. После создания customsum(1) внутри объекта хранится сумма 1. Когда вызывается s(2), Python вызывает s.__call__(2), и значение прибавляется к текущей сумме.

Метод __int__ нужен для выражения:

int(s)

Он возвращает накопленную сумму как обычное целое число.