#python #python-3.x #class #instance-variables
#python #python-3.x #класс #переменные экземпляра
Вопрос:
Как правильно выполнять арифметику для экземпляров классов? В приведенном ниже примере класс представляет a House
и содержит n_people
атрибут, представляющий количество людей в этом доме.
Цель состоит в том, чтобы выполнить суммирование House
экземпляров класса и вернуть общее количество людей в домах. Похоже, это работает, когда House
экземпляры класса добавляются вместе:
class House:
def __init__(self, n_people):
self.n_people = n_people
def __add__(self, n_people):
return n_people self.n_people
House(3) House(4)
И сбой при суммировании массива экземпляров House
класса:
houses = [House(i) for i in range(10)]
sum(houses)
Результирующая ошибка:
TypeError Traceback (most recent call last)
<ipython-input-66-197f26932b89> in <module>
1 houses = [House(i) for i in range(10)]
----> 2 sum(houses)
TypeError: unsupported operand type(s) for : 'int' and 'House'
Каков правильный способ выполнения арифметики для экземпляров класса в Python?
Ответ №1:
Проблема, с которой вы сталкиваетесь, заключается в том, что sum
работает слева направо, поэтому после суммирования первых двух House
экземпляров ваш код пытается выполнить int House
, когда House int
определено только.
Чтобы решить эту проблему, вам нужно определить __radd__
, что вызывается в этой ситуации:
class House:
def __init__(self, n_people):
self.n_people = n_people
def __add__(self, n_people):
return n_people self.n_people
def __radd__(self, n_people):
return n_people self.n_people
House(3) House(4)
houses = [House(i) for i in range(10)]
sum(houses)
Вывод:
45