← Назад к вопросам

Приведи пример полиморфизма

2.3 Middle🔥 151 комментариев
#Другое

Комментарии (1)

🐱
deepseek-v3.2PrepBro AI6 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Пример полиморфизма в объектно-ориентированном программировании

Полиморфизм — это один из ключевых принципов ООП, позволяющий использовать объекты разных классов через единый интерфейс, при этом каждый класс реализует поведение по-своему. Это повышает гибкость и расширяемость кода. Рассмотрим классический пример с геометрическими фигурами.

Базовый класс и наследники

Создадим базовый класс Shape (Фигура) с методом calculate_area() для вычисления площади. Конкретные фигуры (Circle, Rectangle, Triangle) будут переопределять этот метод.

class Shape:
    """Базовый класс для всех фигур."""
    def calculate_area(self):
        """Вычисляет площадь фигуры."""
        raise NotImplementedError("Метод должен быть переопределен в подклассе")

class Circle(Shape):
    """Класс окружности."""
    def __init__(self, radius):
        self.radius = radius
    
    def calculate_area(self):
        """Вычисляет площадь круга: π * r^2."""
        return 3.14159 * self.radius ** 2

class Rectangle(Shape):
    """Класс прямоугольника."""
    def __init__(self, width, height):
        self.width = width
        self.height = height
    
    def calculate_area(self):
        """Вычисляет площадь прямоугольника: ширина * высота."""
        return self.width * self.height

class Triangle(Shape):
    """Класс треугольника."""
    def __init__(self, base, height):
        self.base = base
        self.height = height
    
    def calculate_area(self):
        """Вычисляет площадь треугольника: (основание * высота) / 2."""
        return (self.base * self.height) / 2

Использование полиморфизма

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

def print_areas(shapes):
    """Выводит площади всех фигур в списке."""
    for shape in shapes:
        # Важно: метод calculate_area() вызывается у каждого объекта,
        # но реализация зависит от его класса
        area = shape.calculate_area()
        print(f"Площадь фигуры {type(shape).__name__}: {area:.2f}")

# Создаем список фигур разных типов
shapes = [
    Circle(5),
    Rectangle(4, 6),
    Triangle(3, 8)
]

# Вызываем функцию для вычисления площадей
print_areas(shapes)

Вывод программы:

Площадь фигуры Circle: 78.54
Площадь фигуры Rectangle: 24.00
Площадь фигуры Triangle: 12.00

Ключевые аспекты полиморфизма в примере

  • Единый интерфейс: Все фигуры имеют метод calculate_area(), что позволяет обрабатывать их одинаково в функции print_areas().
  • Разные реализации: Каждый класс предоставляет свою логику вычисления площади, соответствующую конкретной фигуре.
  • Динамическое связывание (позднее связывание): Во время выполнения Python определяет, какую реализацию calculate_area() вызвать, основываясь на типе объекта (например, для Circle вызывается метод из класса Circle).
  • Расширяемость: Можно легко добавить новую фигуру (например, Square), унаследовав от Shape и переопределив calculate_area(), без изменения существующего кода (функция print_areas() продолжит работать).

Типы полиморфизма в Python

В примере выше демонстрируется ad-hoc полиморфизм (переопределение методов), но в Python также существуют:

  • Параметрический полиморфизм: Использование обобщенных типов или функций, работающих с разными типами (например, функция len() работает со строками, списками, словарями).
  • Полиморфизм через утиную типизацию: Объекты рассматриваются по их поведению (наличию методов), а не по типу класса. Например:
class NotAShape:
    """Класс, не наследующий Shape, но имеющий метод calculate_area()."""
    def calculate_area(self):
        return 42

# Функция print_areas() сработает и с этим объектом благодаря утиной типизации
shapes.append(NotAShape())
print_areas(shapes)  # Выведет площадь для NotAShape

Практическая польза в QA Automation

В автоматизации тестирования полиморфизм полезен для:

  • Создания Page Object Model, где базовый класс страницы определяет общие методы, а конкретные страницы переопределяют их.
  • Реализации разных драйверов (WebDriver, MobileDriver) с общим интерфейсом.
  • Обработки разных типов данных (JSON, XML) через единый парсер.
  • Построения гибких тестовых фреймворков, где тестовые шаги могут иметь различное поведение в зависимости от контекста.

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

Приведи пример полиморфизма | PrepBro