我想在仅实现一些功能的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
但是当我这样做时,
p3
是complex
的实例,而不是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