Что такое полиморфизм в ООП и как он реализуется в Python

«Что такое полиморфизм в ООП и как он реализуется в Python» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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

В Python полиморфизм проявляется несколькими способами:

1. Наследование и переопределение методов (Method Overriding)

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

class Shape:
    def area(self):
        raise NotImplementedError("Subclasses should implement this!")

class Square(Shape):
    def __init__(self, side):
        self.side = side

    def area(self):
        return self.side * self.side

class Circle(Shape):
    def __init__(self, radius):
        self.radius = radius

    def area(self):
        return 3.14 * self.radius * self.radius

# Единый интерфейс для разных объектов
for shape in [Square(5), Circle(3)]:
    print(f"Площадь фигуры: {shape.area()}")

2. "Утиная типизация" (Duck Typing)

Ключевая особенность Python. Поведение объекта определяется наличием у него необходимых методов, а не его типом или классом. "Если это выглядит как утка и крякает как утка, то это утка".

class Duck:
    def quack(self):
        print("Quack!")

class Person:
    def quack(self):
        print("I'm quacking like a duck!")

# Функция работает с любым объектом, у которого есть метод quack()
def make_it_quack(obj):
    obj.quack()

make_it_quack(Duck())
make_it_quack(Person())

Практический пример: Система обработки платежей

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

class PaymentGateway:
    def process_payment(self, amount):
        raise NotImplementedError

class StripeGateway(PaymentGateway):
    def process_payment(self, amount):
        print(f"Processing ${amount} payment via Stripe.")

class PayPalGateway(PaymentGateway):
    def process_payment(self, amount):
        print(f"Processing ${amount} payment via PayPal.")

# Основная логика не зависит от конкретной платежной системы
def execute_payment(gateway: PaymentGateway, amount: float):
    gateway.process_payment(amount)

stripe = StripeGateway()
paypal = PayPalGateway()

execute_payment(stripe, 100.0)
execute_payment(paypal, 50.0)