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

Что такое полиморфизм подтипов?

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)
  • Системы логирования
  • Обработчики событий
  • Драйверы БД

Заключение

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