【问题标题】:Inheritance between Point class and Circle classPoint 类和 Circle 类之间的继承
【发布时间】:2018-10-25 00:52:10
【问题描述】:

我刚刚接触到 Python 中的 OOP 风格,并且正在使用类。对于这个特殊问题,我希望我的class Circle 成为我的class 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

我是否存在一些根本性的误解,或者我的目标是不可能/不聪明?任何形式的帮助表示赞赏。干杯。

【问题讨论】:

  • 确定你真的想让circle成为point的子类。除非您认为一个点是一个半径为零的圆(我不认为),否则我不相信这是最好的方法。 包含 一个point,而不是继承自point。换句话说,has-a 而不是is-a
  • @paxdiablo 这就是我最初所做的,但后来我在使用 equals 函数时遇到了困难。它要么太乱,要么我会得到元组错误。
  • 欢迎来到 StackOverflow!你写了一个很好的问题,所以我不确定为什么它被否决了。我修复了它,并且相信社区会帮助像你一样花时间展示他的努力的新用户。祝你好运。

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


【解决方案1】:

这里有一个直接问题:

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

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


无论如何,我不相信将圆视为一种点是正确的 - 它似乎不适合现实世界的建模。

乍一看可能似乎合乎逻辑,因为圆确实通常有一个中心和半径,但想想这对于其他形状(例如矩形)意味着什么.从一个点派生的矩形也必须有 other 个点来指定其他三个角(作为最简单的实现),对待 one 确实没有意义这些点是特别的。

我认为最好有一个点圆(以及您需要的所有其他形状)的公共基类并修改Circle使其has-a指向而不是is-a点。

可能很简单:

class Shape:
    def __eq__(self, other):
        return False
    def type(self):
        return "Shape"

class Point(Shape):
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def type(self):
        return "Point"
    def __eq__(self, other):
        if other.type() != self.type(): return False
        return abs(self.x - other.x) < 0.00001 and abs(self.y - other.y) < 0.00001

class Circle(Shape):
    def __init__(self, x, y, radius):
        self.centre = Point(x,y)
        self.radius = radius
    def type(self):
        return "Circle"
    def __eq__(self, other):
        if other.type() != self.type():
            return False
        return self.centre == other.centre and abs(self.radius - other.radius) < 0.00001

请注意,假设相等的公共基类的默认行为总是错误的,即使对于它自己也是如此,所以如果你尝试比较形状,请不要认为你可以获得任何合理的结果:-)。然后每个子类覆盖它以检查:

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

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

或者实际上是正方形的矩形可能被认为等于正方形,等等。

【讨论】:

  • 出于某种原因,我对类之间的继承存在错误的低估。这非常有帮助,感谢您的洞察力!
猜你喜欢
  • 1970-01-01
  • 2019-03-16
  • 2023-03-31
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 2010-10-06
  • 1970-01-01
  • 2021-08-25
相关资源
最近更新 更多