Наследование

Создайте класс 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()}"
  1. Создайте следующие классы, которые наследуют Figure:
    • круг
    • квадрат
    • прямоугольник
    • равносторонний треугольник

    Они должны переопределять NAME, area(), perimeter() так, чтобы корректно возвращать название фигуры, площадь, периметр. В конструкторы классов должны передаваться размеры: ширина и высота для прямоугольника, сторона для квадрата, радиус для круга, сторона для равностороннего треугольника.

    Для проверки создайте список, заполненный всеми видами фигур, и в цикле распечатайте информацию о каждой фигуре, найдите сумму всех площадей.

  2. В прошлой задаче все классы напрямую наследовали Figure. Теперь унаследуйте прямоугольник от квадрата или квадрат от прямоугольника. Подумайте, как будет лучше.
  3. Добавьте класс Ромб. Ромб создается с помощью информации о длинах двух своих диагоналей. Ромбы должны уметь возвращать информацию о длинах диагоналей.
  4. Добавьте класс Параллелограмм. Параллелограмм создается на основе длин своих сторон. От параллелограмма должны наследоваться прямоугольник и ромб. Квадрат тоже является ромбом, но вы пока не наследуйте квадрат от ромба, потому что придется сделать двойное наследование — от ромба и от прямоугольника — и я предлагаю заранее с этим не связываться.

    Параллелограмм должен уметь возвращать длины двух своих сторон и вычислять периметр. А вот вычисление площади делать не нужно, для этого всё равно не хватает информации. Соответственно, уберите вычисление периметра из классов наследников.

    Обратите внимание, что для создания ромба указываются длины диагоналей, а для создания прямоугольника указываются длины сторон.

  5. Мы хотим иметь возможность вычислять ёмкость фигуры, это отношение ее площади к квадрату периметра. Добавьте в класс Figure метод capacity().

    Переопределите вычисление ёмкости хотя бы в одной из фигур, чтобы вычисление стало более эффективным.

    В цикле, где печатается информация о фигурах, дополнительно распечатайте ёмкость.

    Кстати, у какой фигуры максимальная ёмкость?

  6. Сделайте дополнительно классы Треугольник и прямоугольный треугольник. Унаследуйте правильно все треугольники друг от друга. Научите треугольник вычислять свою площадь и свой периметр по трем сторонам.
  7. (*) Вообще-то квадрат тоже ромб. Но пока это никак не отражено в наследовании. Если хочется сделать квадрат и ромбом, и прямоугольником, потребуется двойное наследование. Это возможно в Python, но когда вы начнете это делать, вы увидите, сколько трудностей при этом возникает. В Java, которую мы будем изучать в следующем году, множественное наследование запрещено. В общем, сделайте что-нибудь с этим, унаследуйте фигуры правильно друг от друга.