Sobes.tech
Назад к вопросам
Junior — Middle
55

Каким образом можно реализовать интерфейс в языке программирования?

Компании, где спрашивали
АО К-Технологии

Ответ от нейросети

sobes.tech AI

Что хотят услышать интервьюеры:

В Python интерфейс обычно реализуют через абстрактные базовые классы, протоколы или неформальный контракт через соглашение по методам. На практике это означает: объект должен иметь нужные методы и свойства, чтобы его можно было использовать полиморфно. Для строгой проверки структуры используют abc.ABC и @abstractmethod, а для более гибкого подхода — typing.Protocol.

Определение:

Интерфейс — это набор ожидаемых методов и/или свойств, которые объект обязан предоставить. В Python нет отдельного ключевого слова interface, как в некоторых других языках, поэтому интерфейс моделируют несколькими способами. Самые распространённые варианты: абстрактные классы для обязательной реализации и протоколы для структурной типизации.

Пример использования:

from abc import ABC, abstractmethod

class Storage(ABC):
    @abstractmethod
    def save(self, data: str) -> None:
        pass

class FileStorage(Storage):
    def save(self, data: str) -> None:
        print(f"Сохраняю в файл: {data}")

class DbStorage(Storage):
    def save(self, data: str) -> None:
        print(f"Сохраняю в БД: {data}")


def process(storage: Storage) -> None:
    storage.save("test payload")


process(FileStorage())
process(DbStorage())

Пояснение кода:

Код не требуется, но пример показывает типичный способ реализации интерфейса через абстрактный класс.

  1. Storage задаёт контракт: любой наследник должен реализовать метод save.
  2. Декоратор @abstractmethod делает метод обязательным к переопределению.
  3. FileStorage и DbStorage реализуют один и тот же интерфейс по-разному.
  4. Функция process работает не с конкретным классом, а с абстракцией Storage.
  5. Это позволяет подменять реализацию без изменения бизнес-логики.

Ключевые моменты:

  • В Python интерфейс чаще всего реализуют через abc.ABC и @abstractmethod.
  • Если нужна проверка “по наличию методов”, удобно использовать typing.Protocol.
  • Интерфейс помогает отделить контракт от реализации и упростить подмену объектов.
  • Такой подход улучшает тестируемость и снижает связность кода.
  • В Python часто достаточно неформального интерфейса: объект считается подходящим, если у него есть нужные методы.