Как выполнить арифметику для двух экземпляров класса (с плавающей точкой в ​​качестве подкласса), которые возвращают экземпляр класса того же типа?например, скорость (2) + скорость (2) - PullRequest
1 голос
/ 12 апреля 2019

Как выполнить арифметику для классов с базовым типом в качестве подкласса, где результат имеет тот же класс?

Например, работает:

class Speed(float):

    def __add__(self, speed):
        if isinstance(speed, Speed):
            return Speed(self + speed)
        else:
            raise NotImplementedError()

    def __repr__(self):
        return f'Speed({self} mph)'

Speed(2) + Speed(2)

Результаты приведены ниже вместо ожидаемых Speed(4):

RecursionError                            Traceback (most recent call last)
<ipython-input-13-ce1336693f4a> in <module>
----> 1 Speed(2) + Speed(2)

<ipython-input-11-f161664be9bc> in __add__(self, speed)
      3     def __add__(self, speed):
      4         if isinstance(speed, Speed):
----> 5             return Speed(self + speed)
      6         else:
      7             raise NotImplementedError()

... last 1 frames repeated, from the frame below ...

<ipython-input-11-f161664be9bc> in __add__(self, speed)
      3     def __add__(self, speed):
      4         if isinstance(speed, Speed):
----> 5             return Speed(self + speed)
      6         else:
      7             raise NotImplementedError()

RecursionError: maximum recursion depth exceeded while calling a Python object

Как правильно выполнить арифметику на таком классе?

1 Ответ

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

Вам нужно преобразовать как self, так и speed в число с плавающей точкой, прежде чем передать его оператору +, так как в противном случае он попытается снова вызвать метод в одном из Speed экземпляров.Это произойдет рекурсивно без условия залога и в конечном итоге приведет к ошибке, как в вашем случае.

return Speed(float(self) + float(speed))
...