Наследование между классом Point и классом Circle - PullRequest
0 голосов
/ 25 октября 2018

Я только вошел в ООП-стиль в python и играл с классами.Для этой конкретной проблемы я хочу, чтобы мой 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

Есть ли какое-то фундаментальное неправильное понимание с моей стороны, или эточто я стремлюсь просто невозможно / не умный?Любая помощь приветствуется.Приветствия.

1 Ответ

0 голосов
/ 25 октября 2018

Одна немедленная проблема заключается здесь:

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

Вы передаете centre (предположительно Point тип), но ссылаетесь на несуществующие переменные x и y.


В любом случае, я не уверен, что правильно считать круг типом точки - он не подходит для моделирования в реальном мире.

Это может показаться логичным на первый взгляд, так как круг обычно имеет центр и радиус, но подумайте, что это будет значить для других форм, таких как прямоугольник.Прямоугольник, который был получен из точки, также должен иметь другие точек, чтобы указать остальные три угла (как простейшая реализация), и действительно нет смысла рассматривать один из этихОчки как особые.

Я думаю, что было бы лучше иметь общий базовый класс, состоящий из точки и круга (и любой другой фигуры, которая вам нужна) и изменить 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) В настоящий момент,это проверяет, что типы идентичны, , но вы можете в равной степени изменить его так, чтобы точка и круг с нулевым радиусом (или прямоугольник с четырьмя одинаковыми угловыми точками или любая другая нулевая «реальная форма»)) считаются идентичными.

Или прямоугольник, который на самом деле является квадратом, можно считать равным квадрату и т. д.

...