Форум сайта python.su
Помогите решить задачу:
Создайте класс «Прямоугольник», у которого необходимо реализовать два поля (ширина и высота) и несколько обязательных методов:
Метод сравнения прямоугольников по площади.
Метод сложения прямоугольников (площадь суммарного прямоугольника должна быть равна сумме площадей прямоугольников, которые вы складываете).
Методы умножения прямоугольника на число n (это должно увеличить площадь базового прямоугольника в n раз).
В классе могут быть созданы и дополнительные (вспомогательные методы)
Несколько уточнений:
1. Методы сложения, умножения, деления и т.д. обязательно должны возвращать новый экземпляр класса Прямоугольник!
2. Для умножения, сложения, сравнения, обязательно нужно переопределять “магичиские” методы. Для умножение есть встроенный метод __mul__
3. Когда в результате мат. действий создаете новый экземпляр класса Прямоугольник, то у этого экземпляра, перемножение сторон, должно давать нужную площадь. Это тоже важно
https://ru.onlinemschool.com/math/formula/rectangle/
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
def get_square(self):
return self.width * self.height
def __eq__(self, other):
return self.get_square() == other.get_square()
def __add__(self, other):
width = self.width + other.width
height = self.height + other.height
return Rectangle(width, height)
def __mul__(self, n):
width = self.width * n
height = self.height * n
return Rectangle(width, height)
def __str__(self):
return f'Rectangle(width={self.width}, height={self.height})'
r1 = Rectangle(2, 4)
r2 = Rectangle(3, 6)
assert r1.get_square() == 8
assert r2.get_square() == 18
r3 = r1 + r2
assert r3.get_square() == 26
r4 = r1 * 4
assert r4.get_square() == 32
Я сделала задачу, но в
r3 = r1 + r2 assert r3.get_square() == 26 r4 = r1 * 4 assert r4.get_square() == 32
выбивает ошибки: AssertionError
[code python][code python][code python][/code][/code][/code]
Офлайн
Изучай математику получше
>>> class Rectangle: ... def __init__(self, width, height): ... self.width = width ... self.height = height ... ... def get_square(self): ... return self.width * self.height ... ... def __eq__(self, other): ... return self.get_square() == other.get_square() ... ... def __add__(self, other): ... width = 1 ... height = self.get_square() + other.get_square() ... return Rectangle(width, height) ... ... def __mul__(self, n): ... width = self.width * n ... height = self.height ... return Rectangle(width, height) ... ... def __str__(self): ... return f'Rectangle(width={self.width}, height={self.height})' ... >>> r1 = Rectangle(2, 4) >>> r2 = Rectangle(3, 6) >>> assert r1.get_square() == 8 >>> assert r2.get_square() == 18 >>> >>> r3 = r1 + r2 >>> assert r3.get_square() == 26 >>> >>> r4 = r1 * 4 >>> assert r4.get_square() == 32 >>>
Отредактировано py.user.next (Март 12, 2023 01:17:55)
Офлайн
Hecate1988
Метод сравнения прямоугольников по площади.
Hecate1988Тут ещё и преподаватель тоже “гений”. С какого-то перепугу у него сравнение прямоугольников только по площади должно проходить через метод __eq__. Дело в том, что метод __eq__ запускается по операции ==, что означает равенство. А прямоугольники равны тогда, когда равны их соответствующие стороны. Площади могут быть равны у совершенно разных прямоугольников. Даже у треугольника или круга площадь может быть равна площади прямоугольника, но из этого же не следует, что это равные фигуры с какого-то перепугу.
2. Для умножения, сложения, сравнения, обязательно нужно переопределять “магичиские” методы.
Отредактировано py.user.next (Март 12, 2023 01:23:27)
Офлайн
Огромное спасибо за ответы!С математикой действительно есть проблемы))
Офлайн
Можно решить таким образом, плюс немного оптимизировать скорость выполнения.
class Rectangle:
def __init__(self, width, height):
self.width = width
self.height = height
@property
def get_square(self):
return self.width * self.height
def __eq__(self, other):
return self.get_square == other.get_square
def __add__(self, other):
combined_area = self.get_square + other.get_square
return Rectangle(combined_area ** 0.5, combined_area / (combined_area ** 0.5))
def __mul__(self, n):
return Rectangle(self.width, n * self.height)
def __str__(self):
return f"Rectangle "
r1 = Rectangle(2, 4)
r2 = Rectangle(3, 6)
assert r1.get_square == 8, ‘Test1’
assert r2.get_square == 18, ‘Test2’
r3 = r1 + r2
assert r3.get_square == 26, ‘Test3’
r4 = r1 * 4
assert r4.get_square == 32, ‘Test4’
Офлайн