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