Point类和Circle类之间的继承

时间:2018-10-25 00:52:10

标签: python-3.x class oop geometry point

我刚刚进入python的OOP风格,并且在玩类。对于此特定问题,我希望class Circleclass Point的子类。但是,对于一定的容忍度进行相等性检查也很重要。但是,我只是不知道如何按照__init__(self, circle, radius)声明圆形变量。最重要的是,由于相等函数,我确实收到了元组错误(我知道这是由于元组不可变)。我已经尝试了无数种方法,但是我只是粘贴了最简单的形式,只是为了更清晰地回应这个想法:

class Point:
    def __init__(self, x, y):
        self.x= x
        self.y= y

    def __eq__(self, other):
    if abs(self.x-other.x)<0.00001 and abs(self.y-other.y)< 0.00001:
        return True
    else:
        return False

class Circle(Point):
    def __init__(self, centre, radius):
        self.centre = Point(x,y)
        self.radius= radius

    def equals(self, other):
        return Point.__eq__(other)<0.00001 and abs(self.radius-other.radius)<0.00001

我是否有一些基本的误解,或者我的目标只是不可能/不明智?任何帮助表示赞赏。干杯。

1 个答案:

答案 0 :(得分:1)

一个立即问题就在这里:

def __init__(self, centre, radius):
    self.centre = Point(x,y)

您传入centre(可能是Point类型),但引用了不存在的变量xy


无论如何,我不认为将圆视为点的类型是正确的-它似乎与现实世界的建模不符。

乍一看似乎是合乎逻辑的,因为一个圆通常具有一个中心和半径,但请考虑一下这对于其他形状(例如矩形)的含义。从一个点派生的矩形还必须具有 other 个点来指定其他三个角(作为最简单的实现),对待 one 确实没有任何意义。这些点中有特殊之处。

我认为最好同时具有点圆(以及您需要的所有其他形状)的通用基类,并修改Circle使其{{1} }点而不是has-a点。

可以如此简单:

is-a

请注意,通用基类的默认行为假定相等性始终为false,即使就其本身而言也是如此,因此,如果您尝试比较形状:-),不要以为可以得到任何有理结果。然后,每个子类都将其覆盖以检查以下内容:

  • 类型兼容(a);和
  • 相关字段是匹配的(根据您的原始代码在一定程度上具有准确性)。

(a)目前,这是在检查类型是否相同,但是您可以同样地对其进行修改,以使一个点和一个零半径的圆(或具有四个相同角点的矩形或任何其他零维“真实形状”)。

或者实际上是正方形的矩形可以被认为等于正方形,依此类推。