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)
Он возвращает накопленную сумму как обычное целое число.