Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Что такое полиморфизм
Полиморфизм — это принцип объектно-ориентированного программирования, который позволяет объектам разных типов отвечать на один и тот же запрос (метод) по-разному. В переводе с греческого «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
Преимущества полиморфизма
- Flexibility — легко расширять код новыми типами
- Reusability — один код работает с разными типами
- Maintainability — меньше дублирования кода
- Decoupling — классы не зависят друг от друга напрямую
Практические рекомендации
- Используй ABC (Abstract Base Classes) для определения интерфейсов
- Избегай isinstance/type checks — вместо этого используй полиморфизм
- Dependency Inversion — передавай интерфейсы, не конкретные классы
- SOLID принципы — полиморфизм реализует Open/Closed Principle
Полиморфизм — это ключ к написанию гибкого и расширяемого кода в Data Engineering.