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