Унаследуйте вызываемый объект от int и возвращайте новый экземпляр при каждом вызове. Так прежние суммы остаются переиспользуемыми; sum_two * 10 равно 20, не 1824.
Интеллектуальный Сумматор
Унаследуйте вызываемый объект от int и возвращайте новый экземпляр при каждом вызове. Так прежние суммы остаются переиспользуемыми; sum_two * 10 равно 20, не 1824.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Создайте вызываемый объект sum_numbers(), который аккумулирует целочисленные значения при последовательных вызовах.
Пример 1:
print(sum_numbers(1))
Вывод: 1
Пример 2:
print(sum_numbers(1)(2))
Вывод: 3
Количество цепочек вызовов не ограничено:
Пример 3:
print(sum_numbers(1)(2)(3))
Вывод: 6
Пример 4:
print(sum_numbers(1)(2)(3)(4))
Вывод: 10
Пример 5:
print(sum_numbers(1)(2)(3)(4)(5))
Вывод: 15
Объект, возвращаемый sum_numbers(), должен оставаться переиспользуемым:
Пример 6:
sum_two = sum_numbers(2)
print(sum_two)
Вывод: 2
Пример 7:
print(sum_two + 5)
Вывод: 7
Пример 8:
print(sum_two(3))
Вывод: 5
Пример 9:
print(sum_two(3)(5))
Вывод: 10
Пример 10:
print(sum_two * 10)
Вывод: 1824
Требуется реализовать объект, поддерживающий как цепочку вызовов, так и обычные арифметические операции (сложение, умножение) с последующим выводом текущей суммы.
Ответ
Унаследуйте вызываемый объект от int и возвращайте новый экземпляр при каждом вызове. Так прежние суммы остаются переиспользуемыми; sum_two * 10 равно 20, не 1824.
class SumNumber(int):
def __call__(self, value):
if type(value) is not int:
raise TypeError('Ожидалось целое число')
return SumNumber(int(self) + value)
def sum_numbers(value):
if type(value) is not int:
raise TypeError('Ожидалось целое число')
return SumNumber(value)
sum_numbers(1)(2)(3) печатается как 6. Объект sum_two=sum_numbers(2) не меняется после sum_two(3), поэтому независимая цепочка sum_two(3)(5) даёт 10, а обычные sum_two+5 и sum_two*10 — 7 и 20. Число 1824 в последнем примере противоречит обычному умножению и является ошибкой условия.