Как правильно выполнить арифметику на экземплярах классов? Например. Суммируйте атрибут n_people для списка экземпляров класса House - PullRequest
1 голос
/ 10 апреля 2019

Как правильно выполнять арифметику на экземплярах классов? В приведенном ниже примере класс представляет 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 Ответ

2 голосов
/ 10 апреля 2019

Проблема, с которой вы сталкиваетесь, заключается в том, что 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
...