Встречается на 26% собеседований по Python

Расскажи про ООП в программировании

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

Основные принципы ООП

ООП строится на четырёх ключевых принципах:

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

Пример на Python

python
class Animal:
    def __init__(self, name):
        self.name = name  # инкапсуляция: атрибут доступен через self

    def speak(self):
        pass  # абстрактный метод, переопределяется в наследниках

class Dog(Animal):  # наследование
    def speak(self):  # полиморфизм: своя реализация
        return f"{self.name} says Гав!"

class Cat(Animal):
    def speak(self):
        return f"{self.name} says Мяу!"

# Создание объектов
animals = [Dog("Бобик"), Cat("Мурка")]
for animal in animals:
    print(animal.speak())  # каждый ведёт себя по-своему

Подводные камни

  • Переиспользование через наследование иногда приводит к хрупким иерархиям. Предпочитайте композицию, если связь между классами не является строгой «is-a».
  • Инкапсуляция в Python реализована на уровне соглашения: атрибуты с одним подчёркиванием (_name) считаются защищёнными, с двумя (__name) — приватными, но доступ к ним всё равно возможен.
  • Множественное наследование может вызвать проблемы порядка разрешения методов (MRO). Используйте его осторожно или применяйте миксины.

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

ООП оправдано, когда:

  • Есть сущности с чёткой структурой и поведением (например, пользователи, заказы, графические фигуры).
  • Требуется моделировать реальные отношения между объектами.
  • Нужно переиспользовать код через наследование или полиморфизм.

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

Коротко

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