Как правильно выполнять арифметику для экземпляров классов? Например. Суммировать атрибут n_people для списка экземпляров класса House

#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