Python

Питон помогите кто понимает

Объявите в программе два класса Point и Rectangle. Объекты первого класса должны создаваться командой:

pt = Point(x, y)
где x, y - координаты точки на плоскости (целые или вещественные числа). При этом в объектах класса Point должны формироваться следующие локальные свойства:

__x, __y - координаты точки на плоскости.

и один геттер:

get_coords() - возвращение кортежа текущих координат __x, __y

Объекты второго класса Rectangle (прямоугольник) должны создаваться командами:

r1 = Rectangle(Point(x1, y1), Point(x2, y2))
или

r2 = Rectangle(x1, y1, x2, y2)
Здесь первая координата (x1, y1) - верхний левый угол, а вторая координата (x2, y2) - правый нижний. При этом, в объектах класса Rectangle (вне зависимости от способа их создания) должны формироваться следующие локальные свойства:

__sp - объект класса Point с координатами x1, y1 (верхний левый угол);
__ep - объект класса Point с координатами x2, y2 (нижний правый угол).

Также к классе Rectangle должны быть реализованы следующие методы:

set_coords(self, sp, ep) - изменение текущих координат, где sp, ep - объекты класса Point;
get_coords(self) - возвращение кортежа из объектов класса Point с текущими координатами прямоугольника (ссылки на локальные свойства __sp и __ep);
draw(self) - отображение в консоли сообщения: "Прямоугольник с координатами: (x1, y1) (x2, y2)". Здесь x1, y1, x2, y2 - соответствующие числовые значения координат.

Создайте объект rect класса Rectangle с координатами (0, 0), (20, 34).

P.S. На экран ничего выводить не нужно


Для примера:

Тест
assert isinstance(rect, Rectangle) and hasattr(Rectangle, 'set_coords') and hasattr(Rectangle, 'get_coords') and hasattr(Rectangle, 'draw'), "в классе Rectangle присутствуют не все методы
Результат
Держите:
 from typing import Union

class Point:

def __init__(self, x: float, y: float): self.__x, self.__y = x, y

def get_coords(self): return self.__x, self.__y

def __str__(self): return f'({self.__x},{self.__y})'

class Rectangle:

def __init__(self, sx: Union[float, Point], sy: Union[float, Point], ex: float = None, ey: float = None):
self.__sp, self.__ep = None, None
if isinstance(sx, (int, float)) and isinstance(sy, (int, float)):
if isinstance(ex, (int, float)) and isinstance(ey, (int, float)):
self.__sp, self.__ep = Point(sx, sy), Point(ex, ey)
else:
raise TypeError('Не переданы 4 координаты')
elif isinstance(sx, Point) and isinstance(sy, Point):
if ex is None and ey is None:
self.__sp, self.__ep = sx, sy
else:
raise TypeError('Переданы лишние координаты, помимо двух точек')
else:
raise TypeError('Переданы координаты неопознанного типа')

def get_coords(self): return self.__sp, self.__ep

def set_coords(self, sp: Point, ep: Point): self.__sp, self.__ep = sp, ep

def draw(self): print('Прямоугольник с координатами ' + str(self))

def __str__(self): return f'({self.__sp},{self.__ep})'

rect = Rectangle(0, 0, 20, 34)
rect.draw()

rect = Rectangle(0.0, 0.0, 20.0, 34.0)
rect.draw()

rect = Rectangle(Point(0, 0), Point(20, 34))
rect.draw()

rect = Rectangle(Point(0.0, 0.0), Point(20.0, 34.0))
rect.draw()

assert isinstance(rect, Rectangle) and hasattr(Rectangle, 'set_coords') and hasattr(Rectangle, 'get_coords') and hasattr(Rectangle, 'draw'), "в классе Rectangle присутствуют не все методы"
Лишние примеры (rect = Rectangle(...)) и вызовы draw() можете удалить перед сдачей, оставив один rect и assert на него.

Сложная логика с Union и распознаванием типов вручную включена для выполнения требования, что Rectangle может инициализироваться как двумя точками, так и непосредственно четырьмя координатами. В Питоне не нашёл другого способа сделать полиморфный конструктор.

Примечательно, что int можно передать в параметре типа float, но во время выполнения тип параметра будет распознаваться как int, а не как float. "Чудесная" особенность Питона.

Методы __str__ включены, чтобы печатать значения в читабельном виде без дополнительных приседаний с get_coords и т.п.
Габиден Хамидуллин
Габиден Хамидуллин
87 571
Лучший ответ
Павел Кругликов Не прошел код