如何对返回相同类型的类实例的两个类实例(以float作为子类)执行算术运算?例如速度(2)+速度(2)

时间:2019-04-12 06:59:13

标签: python python-3.x class inheritance subclass

如何对具有基本类型作为子类的类进行运算,而结果属于同一类?

例如,运行:

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 个答案:

答案 0 :(得分:2)

您需要先将selfspeed都转换为float,然后再将其交给+运算符,因为否则它将尝试再次在{{1 }}实例。这将在没有保释条件的情况下递归发生,最终会像您的情况一样出错。

Speed