Наследование
Создайте класс Figure
, который означает геометрическую фигуру. По ходу решения постоянно
пишите код, который проверяет работоспособность всех реализованных функций.
class Figure:
NAME = "general figure"
def area(self):
pass
def perimeter(self):
pass
def __str__(self):
return f"A {self.NAME} with area {self.area():.3f} and perimeter {self.perimeter()}"
- Создайте следующие классы, которые наследуют Figure:
- круг
- квадрат
- прямоугольник
- равносторонний треугольник
Они должны переопределять
NAME
,area()
,perimeter()
так, чтобы корректно возвращать название фигуры, площадь, периметр. В конструкторы классов должны передаваться размеры: ширина и высота для прямоугольника, сторона для квадрата, радиус для круга, сторона для равностороннего треугольника.Для проверки создайте список, заполненный всеми видами фигур, и в цикле распечатайте информацию о каждой фигуре, найдите сумму всех площадей.
- В прошлой задаче все классы напрямую наследовали
Figure
. Теперь унаследуйте прямоугольник от квадрата или квадрат от прямоугольника. Подумайте, как будет лучше. - Добавьте класс Ромб. Ромб создается с помощью информации о длинах двух своих диагоналей. Ромбы должны уметь возвращать информацию о длинах диагоналей.
-
Добавьте класс Параллелограмм. Параллелограмм создается на основе длин своих сторон. От параллелограмма должны наследоваться прямоугольник и ромб. Квадрат тоже является ромбом, но вы пока не наследуйте квадрат от ромба, потому что придется сделать двойное наследование — от ромба и от прямоугольника — и я предлагаю заранее с этим не связываться.
Параллелограмм должен уметь возвращать длины двух своих сторон и вычислять периметр. А вот вычисление площади делать не нужно, для этого всё равно не хватает информации. Соответственно, уберите вычисление периметра из классов наследников.
Обратите внимание, что для создания ромба указываются длины диагоналей, а для создания прямоугольника указываются длины сторон.
-
Мы хотим иметь возможность вычислять ёмкость фигуры, это отношение ее площади к квадрату периметра. Добавьте в класс
Figure
методcapacity()
.Переопределите вычисление ёмкости хотя бы в одной из фигур, чтобы вычисление стало более эффективным.
В цикле, где печатается информация о фигурах, дополнительно распечатайте ёмкость.
Кстати, у какой фигуры максимальная ёмкость?
- Сделайте дополнительно классы Треугольник и прямоугольный треугольник. Унаследуйте правильно все треугольники друг от друга. Научите треугольник вычислять свою площадь и свой периметр по трем сторонам.
- (*) Вообще-то квадрат тоже ромб. Но пока это никак не отражено в наследовании. Если хочется сделать квадрат и ромбом, и прямоугольником, потребуется двойное наследование. Это возможно в Python, но когда вы начнете это делать, вы увидите, сколько трудностей при этом возникает. В Java, которую мы будем изучать в следующем году, множественное наследование запрещено. В общем, сделайте что-нибудь с этим, унаследуйте фигуры правильно друг от друга.