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

Какие знаешь парадигмы разработки в Python?

1.7 Middle🔥 191 комментариев
#Python Core#Архитектура и паттерны

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

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

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

Парадигмы разработки в Python

Python поддерживает несколько парадигм программирования. Каждая имеет свои преимущества.

1. Объектно-ориентированная (OOP)

class Animal:
    def __init__(self, name):
        self.name = name
    
    def speak(self):
        pass

class Dog(Animal):
    def speak(self):
        return "Woof!"

dog = Dog("Rex")
print(dog.speak())  # Woof!

Фокус на объектах и их взаимодействии.

2. Функциональная (FP)

from functools import reduce

numbers = [1, 2, 3, 4, 5]

# Map
squares = list(map(lambda x: x ** 2, numbers))

# Filter
evens = list(filter(lambda x: x % 2 == 0, numbers))

# Reduce
total = reduce(lambda a, b: a + b, numbers)

Фокус на функциях и неизменяемости данных.

3. Императивная

# Пошаговые инструкции
result = []
for i in range(10):
    if i % 2 == 0:
        result.append(i ** 2)

print(result)  # [0, 4, 16, 36, 64]

Инструктирование компьютера ШТО делать и КАК.

4. Декларативная

# Описание ТОГО, ЧТО нужно, а не КАК
result = [i ** 2 for i in range(10) if i % 2 == 0]
print(result)  # [0, 4, 16, 36, 64]

Записываем результат, Python решает как это вычислить.

5. Процедурная

def calculate(data):
    # Последовательность процедур
    cleaned = clean_data(data)
    processed = process(cleaned)
    validated = validate(processed)
    return validated

result = calculate(raw_data)

Фокус на функциях и процедурах.

6. Метапрограммирование

# Код, который генерирует код
class Meta(type):
    def __new__(mcs, name, bases, attrs):
        attrs['hello'] = lambda self: "Hello"
        return super().__new__(mcs, name, bases, attrs)

class MyClass(metaclass=Meta):
    pass

obj = MyClass()
print(obj.hello())  # Hello

7. Асинхронная / Реактивная

import asyncio

async def fetch_data(url):
    await asyncio.sleep(1)
    return "data"

async def main():
    result = await fetch_data('url')
    print(result)

asyncio.run(main())

Фокус на событиях и асинхронном выполнении.

8. Обобщённое программирование (Generic)

from typing import TypeVar, Generic, List

T = TypeVar('T')

class Container(Generic[T]):
    def __init__(self, items: List[T]):
        self.items = items
    
    def get(self, index: int) -> T:
        return self.items[index]

int_container = Container([1, 2, 3])
str_container = Container(['a', 'b', 'c'])

9. Логическая парадигма (Prolog-style)

# Очень редко в Python, но возможна
# Используется в специальных библиотеках
from pyswip import Prolog

prolog = Prolog()
prolog.assertz("parent(tom, bob)")
prolog.assertz("parent(tom, liz)")

for solution in prolog.query("parent(tom, X)"):
    print(solution["X"])  # bob, liz

10. Контрактное программирование

from contracts import contract

@contract(x='int,>=0', returns='int,>0')
def factorial(x):
    if x == 0:
        return 1
    return x * factorial(x - 1)

print(factorial(5))  # 120
print(factorial(-1))  # ContractError!

Комбинированный подход

class DataProcessor:
    """Комбинирует OOP, FP и async"""
    
    def __init__(self, data):
        self.data = data
    
    async def process(self):
        # Декларативно-функциональный подход
        result = [
            item * 2 
            for item in self.data
            if item > 0
        ]
        return result
    
    def map_data(self, func):
        """Функциональный подход"""
        return list(map(func, self.data))

# Использование
processor = DataProcessor([1, -2, 3, -4, 5])
result = processor.map_data(lambda x: x ** 2)
print(result)  # [1, 4, 9, 16, 25]

Когда использовать какую

pardigms = {
    'OOP': 'Большие системы, сложная логика',
    'FP': 'Data processing, transformations',
    'Async': 'I/O-bound операции, веб-приложения',
    'Declarative': 'List/dict comprehensions',
    'Imperative': 'Простые скрипты',
    'Generic': 'Переиспользуемые компоненты',
}

Лучшие практики

# 1. Используй подходящую парадигму
class User:  # OOP для модели
    def __init__(self, name):
        self.name = name

def process_users(users):  # FP для обработки
    return list(map(lambda u: u.name.upper(), users))

# 2. Комбинируй парадигмы
users = [User('john'), User('jane')]
names = [u.name for u in users if u]  # OOP + declarative

# 3. Не переусложняй
# ❌ Избыточно сложно
result = reduce(lambda a, b: a + list(map(lambda x: x ** 2, b)), ...)

# ✅ Просто и понятно
result = [x ** 2 for sublist in data for x in sublist]

Вывод: Python — мультипарадигменный язык. Лучше выбирать правильную парадигму для каждой задачи, часто комбинируя несколько.