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

Можете объяснить принципы объектно-ориентированного программирования?

Компании, где спрашивали
Магнит Тех
ООО Цитадель
Стилсофт
БилайнБилайн
Атом Безопасность
GGSel

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

sobes.tech AI

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

ООП — это способ строить программу из объектов, которые объединяют данные и поведение. Обычно ожидают услышать четыре базовых принципа: инкапсуляцию, наследование, полиморфизм и абстракцию. Важно показать, что это не только термины, но и практические инструменты для уменьшения связности и упрощения поддержки кода.

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

Объектно-ориентированное программирование — это парадигма, в которой программа моделируется как набор взаимодействующих объектов. Каждый объект хранит состояние в полях и предоставляет поведение через методы. Это позволяет логично группировать данные и операции над ними, делать код более читаемым и расширяемым.

  • Инкапсуляция — скрытие внутреннего состояния и доступ к нему через публичный интерфейс.
  • Наследование — создание нового класса на основе существующего с возможностью переиспользовать и расширять поведение.
  • Полиморфизм — единый интерфейс для объектов разных типов, которые по-разному реализуют поведение.
  • Абстракция — выделение существенных характеристик объекта и сокрытие деталей реализации.

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

Например, в системе доставки можно выделить общий базовый тип Delivery, а для курьера, постамата и почты сделать отдельные реализации с разным способом расчёта стоимости и сроков.

from abc import ABC, abstractmethod

class Delivery(ABC):
    @abstractmethod
    def cost(self, distance_km: float) -> float:
        pass

class CourierDelivery(Delivery):
    def cost(self, distance_km: float) -> float:
        return 300 + distance_km * 20

class PickupDelivery(Delivery):
    def cost(self, distance_km: float) -> float:
        return 0

def print_delivery_cost(delivery: Delivery, distance_km: float) -> None:
    print(delivery.cost(distance_km))

print_delivery_cost(CourierDelivery(), 5)
print_delivery_cost(PickupDelivery(), 5)

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

В этом примере код показывает абстракцию и полиморфизм.

  1. Delivery — абстрактный базовый класс. Он задаёт общий контракт: у всех доставок должен быть метод cost.
  2. CourierDelivery реализует этот контракт и считает стоимость по своей формуле.
  3. PickupDelivery тоже реализует cost, но возвращает 0, так как самовывоз бесплатный.
  4. Функция print_delivery_cost работает не с конкретным классом, а с абстракцией Delivery.
  5. Это позволяет добавлять новые виды доставки, не меняя логику печати стоимости.

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

  • ООП помогает моделировать предметную область через объекты, а не через набор разрозненных функций.
  • Инкапсуляция уменьшает число мест, которые зависят от внутреннего устройства класса.
  • Наследование полезно для переиспользования, но его не стоит использовать без необходимости.
  • Полиморфизм позволяет писать код, который работает с разными реализациями через общий интерфейс.
  • Абстракция делает систему гибче: можно заменять детали реализации, не ломая внешний код.
  • В Python ООП часто реализуют через классы, но важно помнить, что язык поддерживает и другие стили программирования.