Глава 14 · Создаём объекты реального мира
Мини-проект: полиморфные фигуры
Общий предок задаёт интерфейс, каждая фигура реализует его по-своему — наследование и полиморфизм вместе.
Мини-проект: полиморфные фигуры
Общий предок Figura хранит имя фигуры; каждая конкретная
фигура переопределяет ploshchad() по-своему — наследование
(14.15) и полиморфизм (14.18) вместе:
figury.py
class Figura:
def __init__(self, nazvanie):
self.nazvanie = nazvanie
def ploshchad(self):
raise NotImplementedError
class Krug(Figura):
def __init__(self, radius):
super().__init__("круг")
self.radius = radius
def ploshchad(self):
return 3.14159 * self.radius ** 2
class Pryamougolnik(Figura):
def __init__(self, width, height):
super().__init__("прямоугольник")
self.width = width
self.height = height
def ploshchad(self):
return self.width * self.height
class Treugolnik(Figura):
def __init__(self, base, height):
super().__init__("треугольник")
self.base = base
self.height = height
def ploshchad(self):
return 0.5 * self.base * self.height
Figura
Krug
Pryamougolnik
Treugolnik
ispolzovanie.py
figury = [Krug(5), Pryamougolnik(4, 6), Treugolnik(8, 3)]
for f in figury:
print(f"{f.nazvanie}: {f.ploshchad():.2f}")
# круг: 78.54
# прямоугольник: 24.00
# треугольник: 12.00
raise NotImplementedError — сигнал «доделай в наследнике»
Figura.ploshchad() намеренно не вычисляет ничего полезного — она существует только чтобы задать ОБЩИЙ ИНТЕРФЕЙС, который обязаны реализовать наследники. Если забыть переопределить ploshchad() в новой фигуре, ошибка обнаружится сразу же при первом вызове, а не тихо выдаст неверную площадь.★★ Самостоятельная задача
perimetr
Добавьте Figura метод-заглушку perimetr() (raise NotImplementedError) и реализуйте его во всех трёх фигурах. Подсказка для Treugolnik: base и height одних не хватает для точного периметра — считайте его равнобедренным и найдите боковую сторону по теореме Пифагора.
Практика: полиморфные фигуры
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки