Какие основные принципы ООП и как их распознать в коде?

«Какие основные принципы ООП и как их распознать в коде?» — вопрос из категории ООП, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Код соответствует принципам ООП, если в его архитектуре прослеживаются четыре ключевых концепции:

  1. Инкапсуляция (Encapsulation)

    • Что это? Объединение данных (атрибутов) и методов для их обработки в одном объекте (классе) и сокрытие внутреннего состояния объекта от внешнего мира.
    • Как распознать? Использование классов. Доступ к данным осуществляется через публичные методы (getters/setters), а сами данные помечены как приватные (например, с префиксами _ или __ в Python).

      class BankAccount:
      def __init__(self, balance):
          self.__balance = balance  # __balance скрыт от прямого доступа
      
      def get_balance(self):
          return self.__balance
  2. Наследование (Inheritance)

    • Что это? Механизм, позволяющий создавать новый класс (потомок) на основе существующего (родителя), перенимая его атрибуты и методы.
    • Как распознать? Класс в своем определении указывает другой класс в скобках. Это устанавливает отношение "является" (is-a).
      
      class Animal: # Родительский класс
      def move(self):
          print("Moving...")

    class Dog(Animal): # Dog является Animal def bark(self): print("Woof!")

  3. Полиморфизм (Polymorphism)

    • Что это? Способность объектов с одинаковым интерфейсом (набором методов) иметь разную реализацию этих методов. Позволяет работать с объектами разных классов единообразно.
    • Как распознать? Разные классы имеют методы с одинаковым названием, но разным поведением. Код вызывает этот метод, не зная точного типа объекта.
      
      class Cat(Animal):
      def speak(self):
          return "Meow"

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

    Функция работает с любым объектом, у которого есть метод speak()

    def print_sound(animal: Animal): print(animal.speak())

    print_sound(Cat()) # Выведет "Meow" print_sound(Dog()) # Выведет "Woof"

  4. Абстракция (Abstraction)

    • Что это? Выделение наиболее значимых характеристик объекта и игнорирование второстепенных. Создание "контракта" или "шаблона" (абстрактного класса), который определяет, что должны делать классы-наследники, но не говорит, как.
    • Как распознать? Использование абстрактных классов (в Python — модуль abc) с абстрактными методами, которые обязательны для реализации в дочерних классах.
      
      from abc import ABC, abstractmethod

    class Shape(ABC): # Абстрактный класс @abstractmethod def area(self): # Абстрактный метод - "контракт" pass

    class Square(Shape): def init(self, side): self.side = side

    def area(self): # Реализация контракта
        return self.side ** 2