← Назад к вопросам
Что такое полиморфизм подтипов?
2.0 Middle🔥 131 комментариев
#Python Core#Soft Skills
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Полиморфизм подтипов (Subtype Polymorphism)
Полиморфизм подтипов — это способность объектов разных типов отвечать на один и тот же набор операций через единый интерфейс. Это фундаментальный принцип ООП, основанный на наследовании.
Ключевая идея
Подтип может заменять свой базовый тип без нарушения корректности программы (принцип Liskov Substitution Principle).
Пример
from abc import ABC, abstractmethod
class Animal(ABC):
@abstractmethod
def sound(self):
pass
class Dog(Animal):
def sound(self):
return "Woof!"
class Cat(Animal):
def sound(self):
return "Meow!"
def announce(animal: Animal):
print(animal.sound())
# Полиморфизм: один метод, разное поведение
announce(Dog()) # Woof!
announce(Cat()) # Meow!
Практический пример: система платежей
from abc import ABC, abstractmethod
class PaymentProcessor(ABC):
@abstractmethod
def process(self, amount: float) -> bool:
pass
class CreditCard(PaymentProcessor):
def process(self, amount: float) -> bool:
print(f"Processing {amount} via Credit Card")
return True
class PayPal(PaymentProcessor):
def process(self, amount: float) -> bool:
print(f"Processing {amount} via PayPal")
return True
class CheckoutService:
def __init__(self, processor: PaymentProcessor):
self.processor = processor
def checkout(self, amount: float):
return self.processor.process(amount)
# Система независима от конкретного процессора
for processor in [CreditCard(), PayPal()]:
service = CheckoutService(processor)
service.checkout(100)
Типы полиморфизма
Подтипы (наследование):
- Основано на иерархии классов
- Runtime полиморфизм (динамическая диспетчеризация)
Параметрический (Generic типы):
from typing import Generic, TypeVar
T = TypeVar('T')
class Box(Generic[T]):
def __init__(self, value: T):
self.value = value
Преимущества
- Гибкость и расширяемость
- Слабая связанность
- Переиспользуемость кода
- Простота тестирования
Liskov Substitution Principle (LSP)
# Правильно: квадрат корректно заменяет прямоугольник
class Rectangle:
def set_width(self, w):
self.width = w
def set_height(self, h):
self.height = h
def area(self):
return self.width * self.height
class Square(Rectangle):
def set_width(self, w):
self.width = self.height = w
def set_height(self, h):
self.width = self.height = h
Практическое применение
Полиморфизм подтипов используется везде:
- Django ORM (QuerySet, Model)
- Фреймворки для http (Flask, FastAPI)
- Системы логирования
- Обработчики событий
- Драйверы БД
Заключение
Полиморфизм подтипов — это основа гибких, масштабируемых систем. Позволяет писать код через абстракции вместо конкретных реализаций.