我想在仅实现一些功能的Python 3.7程序中创建一个简单的Point2d类。我在一个SO答案(我现在找不到)中看到,创建Point类的一种方法是覆盖complex,所以我这样写:

import math

class Point2d(complex):

    def distanceTo(self, otherPoint):
        return math.sqrt((self.real - otherPoint.real)**2 + (self.imag - otherPoint.imag)**2)

    def x(self):
        return self.real

    def y(self):
        return self.imag


这有效:

In [48]: p1 = Point2d(3, 3)

In [49]: p2 = Point2d(6, 7)

In [50]: p1.distanceTo(p2)
Out[50]: 5.0


但是当我这样做时,p3complex的实例,而不是Point2d的实例:

In [51]: p3 = p1 + p2

In [52]: p3.distanceTo(p1)
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-52-37fbadb3015e> in <module>
----> 1 p3.distanceTo(p1)

AttributeError: 'complex' object has no attribute 'distanceTo'


我的大部分背景是使用Objective-C和C#编写的,因此我仍在尝试找出执行此类操作的pythonic方法。我是否需要覆盖要在Point2d类上使用的所有数学运算符?还是我完全以错误的方式进行此操作?

最佳答案

在这种情况下,我建议从头开始实现您的类Point2d

如果您很懒,请查看一些类似sympy的库,其中包括一个Point类和其他几何元素https://docs.sympy.org/latest/modules/geometry/index.html

10-07 23:22