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

Что такое интерфейс в ООП?

1.0 Junior🔥 161 комментариев
#Python Core#Архитектура и паттерны

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

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

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

Интерфейс в ООП

Интерфейс (Interface) — это абстрактный контракт, который определяет, какие методы должен иметь класс, но не определяет, как эти методы реализуются. Это фундаментальный концепт ООП, обеспечивающий полиморфизм и loose coupling между компонентами.

Назначение интерфейсов

1. Определение контракта — интерфейс говорит: "если ты реализуешь меня, у тебя должны быть эти методы"

2. Полиморфизм — разные классы могут реализовать один интерфейс по-разному

3. Слабая связанность — код работает с интерфейсом, а не с конкретной реализацией

В Python: Abstract Base Classes (ABC)

В Python интерфейсы реализуются через abc.ABC и @abstractmethod:

from abc import ABC, abstractmethod

class PaymentProcessor(ABC):
    def process_payment(self, amount: float) -> bool:
        pass
    
    @abstractmethod
    def refund(self, transaction_id: str) -> bool:
        pass

Реализация интерфейса

Класс должен реализовать все абстрактные методы:

class StripeProcessor(PaymentProcessor):
    def process_payment(self, amount: float) -> bool:
        print(f"Processing ${amount} via Stripe")
        return True
    
    def refund(self, transaction_id: str) -> bool:
        print(f"Refunding via Stripe")
        return True

Полиморфизм через интерфейсы

Код может работать с любым классом, реализующим интерфейс:

def process_order(processor: PaymentProcessor, amount: float):
    if processor.process_payment(amount):
        print("Payment successful")
        return True
    return False

Практический пример: DI

Интерфейсы особенно полезны при внедрении зависимостей:

class Repository(ABC):
    @abstractmethod
    def get(self, id: int):
        pass

class UserService:
    def __init__(self, repo: Repository):
        self.repo = repo
    
    def get_user(self, id: int):
        return self.repo.get(id)

Protocol vs ABC

Python 3.8+ предлагает Protocol — более гибкий способ определения интерфейсов:

from typing import Protocol

class Drawable(Protocol):
    def draw(self) -> None: ...

class Circle:
    def draw(self) -> None:
        print("Drawing circle")

render(Circle())

Заключение

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