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

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

1.0 Junior🔥 201 комментариев
#Python

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

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

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

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

Полиморфизм — это принцип объектно-ориентированного программирования, который позволяет объектам разных типов отвечать на один и тот же запрос (метод) по-разному. В переводе с греческого «poly» означает «много», а «morphism» — «форма».

Основные виды полиморфизма

1. Полиморфизм подтипов (Subtype Polymorphism)

Основывается на наследовании. Дочерние классы переопределяют методы родительского класса.

class DataSource:
    def fetch_data(self):
        raise NotImplementedError

class PostgresDataSource(DataSource):
    def fetch_data(self):
        return "Data from PostgreSQL"

class MongoDataSource(DataSource):
    def fetch_data(self):
        return "Data from MongoDB"

def load_data(source: DataSource):
    return source.fetch_data()

# Один код, разные результаты
db_pg = PostgresDataSource()
db_mongo = MongoDataSource()

print(load_data(db_pg))      # Data from PostgreSQL
print(load_data(db_mongo))   # Data from MongoDB

2. Параметрический полиморфизм (Generics)

Одна функция/класс работает с данными разных типов.

from typing import TypeVar, Generic

T = TypeVar('T')

class DataContainer(Generic[T]):
    def __init__(self, value: T):
        self.value = value
    
    def get(self) -> T:
        return self.value

# Работает с любым типом
int_container = DataContainer[int](42)
str_container = DataContainer[str]("Hello")
list_container = DataContainer[list]([1, 2, 3])

3. Полиморфизм операторов (Operator Overloading)

Один оператор работает по-разному для разных типов.

class Vector:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    
    def __add__(self, other):
        return Vector(self.x + other.x, self.y + other.y)
    
    def __str__(self):
        return f"Vector({self.x}, {self.y})"

v1 = Vector(1, 2)
v2 = Vector(3, 4)
v3 = v1 + v2  # __add__ вызывается
print(v3)  # Vector(4, 6)

4. Полиморфизм методов (Method Overloading)

В Python это реализуется через default параметры или *args/**kwargs.

class Calculator:
    def add(self, *args):
        return sum(args)

calc = Calculator()
print(calc.add(1, 2))           # 3
print(calc.add(1, 2, 3, 4))    # 10

Полиморфизм в контексте Data Engineer

Пример: Разные источники данных

from abc import ABC, abstractmethod
import pandas as pd

class DataExtractor(ABC):
    @abstractmethod
    def extract(self) -> pd.DataFrame:
        pass

class PostgresExtractor(DataExtractor):
    def extract(self) -> pd.DataFrame:
        # SQL запрос к PostgreSQL
        query = "SELECT * FROM users"
        return pd.read_sql(query, conn)

class CSVExtractor(DataExtractor):
    def extract(self) -> pd.DataFrame:
        return pd.read_csv('users.csv')

class APIExtractor(DataExtractor):
    def extract(self) -> pd.DataFrame:
        response = requests.get('https://api.example.com/users')
        return pd.DataFrame(response.json())

def etl_pipeline(extractor: DataExtractor):
    df = extractor.extract()
    df = df.dropna()
    # Transform and load...
    return df

# Один код для разных источников
etl_pipeline(PostgresExtractor())   # Данные из БД
etl_pipeline(CSVExtractor())        # Данные из файла
etl_pipeline(APIExtractor())        # Данные из API

Преимущества полиморфизма

  1. Flexibility — легко расширять код новыми типами
  2. Reusability — один код работает с разными типами
  3. Maintainability — меньше дублирования кода
  4. Decoupling — классы не зависят друг от друга напрямую

Практические рекомендации

  1. Используй ABC (Abstract Base Classes) для определения интерфейсов
  2. Избегай isinstance/type checks — вместо этого используй полиморфизм
  3. Dependency Inversion — передавай интерфейсы, не конкретные классы
  4. SOLID принципы — полиморфизм реализует Open/Closed Principle

Полиморфизм — это ключ к написанию гибкого и расширяемого кода в Data Engineering.