Каковы основные принципы объектно-ориентированного программирования (ООП)?

Ответ

ООП — парадигма программирования, основанная на объектах, которые объединяют данные (поля/атрибуты) и поведение (методы).

Четыре основных принципа:

  1. Инкапсуляция — сокрытие внутреннего состояния объекта и предоставление доступа только через публичные методы. Защищает данные от некорректного изменения.

    class BankAccount:
        def __init__(self):
            self._balance = 0  # "Защищенный" атрибут
        def deposit(self, amount):
            if amount > 0:
                self._balance += amount  # Изменение только через метод
  2. Наследование — создание нового класса (дочернего) на основе существующего (родительского) с возможностью переиспользования и расширения его функциональности.

    class Vehicle:
        def move(self):
            print("Moving...")
    class Car(Vehicle):  # Car наследует от Vehicle
        def honk(self):
            print("Beep!")
  3. Полиморфизм — способность объектов с одинаковым интерфейсом (методом) иметь разную реализацию.

    class Dog:
        def speak(self):
            return "Woof!"
    class Cat:
        def speak(self):
            return "Meow!"
    # Один интерфейс — разное поведение
    for animal in [Dog(), Cat()]:
        print(animal.speak())
  4. Абстракция — выделение существенных характеристик объекта и игнорирование несущественных деталей, что упрощает работу со сложными системами.

    # Абстракция через абстрактный класс
    from abc import ABC, abstractmethod
    class DatabaseConnector(ABC):
        @abstractmethod
        def connect(self):
            pass  # Детали реализации скрыты

Ответ 18+ 🔞

Давай разберём эту вашу ООП-хуйню, а то сидят какие-то умники, блядь, и кидаются словами «инкапсуляция», «полиморфизм» — а ты нихуя не понимаешь, о чём они, и чувствуешь себя дебилом. Не, ну а хули? Я тебе на пальцах объясню, в рот меня чих-пых!

Представь, что ты не просто программист, а, блядь, директор завода игрушек. Вот тебе и вся парадигма.

Первый принцип — инкапсуляция. Это когда у тебя на заводе есть сейф с деньгами, ёпта. Ты не разрешаешь каждому работнику лазить туда руками и пересчитывать купюры, а то они там, сука, начнут «немножко брать». Вместо этого ты ставишь кассиршу — толстую, злую тётю Люду — и говоришь: «Вот, блядь, метод deposit(). Хочешь положить деньги — неси Люде, она проверит и положит. Хочешь снять — пиши заявление, Люда проверит и выдаст». Внутри сейфа (_balance) — твоё дело, как там всё лежит. Главное — доступ только через тётю Люду (публичные методы), иначе — пиздык по рукам.

class BankAccount:
    def __init__(self):
        self._balance = 0  # Сейф, блядь. Не лезь.
    def deposit(self, amount):
        if amount > 0:
            self._balance += amount  # Только через метод, сука!

Второй — наследование. Ну тут вообще просто, блядь. Есть у тебя, допустим, общая заготовка «Игрушка» — у неё есть кнопка, и при нажатии она говорит «пи-пи». А теперь ты делаешь «Машинку». Зачем тебе заново придумывать, как работает кнопка? Ты берёшь заготовку «Игрушка», говоришь «Машинка, ты теперь игрушка, но ещё и гуди!» — и всё, блядь, готово. Всё, что умела игрушка, умеет и машинка, плюс своё добавил.

class Vehicle:
    def move(self):
        print("Moving...")  # Базовая хуйня для всех
class Car(Vehicle):  # Car — это Vehicle, ёпта. Всё от него получает.
    def honk(self):
        print("Beep!")  # И своё ещё добавил

Третий — полиморфизм. Во, это, блядь, мощно звучит, а на деле — ерунда. У тебя есть команда «Говори!». Ты её кричишь собаке — она гавкает. Кричишь коту — он мяукает. Кричишь тёще... ну, ладно. Суть в чём? Одна команда, а реакция разная, потому что объекты разные. И тебе, как директору, похуй, кто как реализует эту команду внутри себя — главное, чтобы по команде «Говори!» все издавали свой звук.

class Dog:
    def speak(self):
        return "Woof!"  # Собачья реализация, блядь
class Cat:
    def speak(self):
        return "Meow!"  # Кошачья реализация, нахуй
# А ты всех подряд строишь и командуешь
for animal in [Dog(), Cat()]:
    print(animal.speak())  # Один интерфейс — разный результат, ёбана!

Четвёртый — абстракция. Это когда тебе, как директору, похуй, как там внутри работает станок, который выпиливает мишек. Тебе важно, что у него есть кнопка «Пуск» и кнопка «Стоп». Как он там шестерёнки крутит, мотор гудит — это не твоя проблема, это проблема инженера Пети, который его проектировал. Ты работаешь только с простым интерфейсом, а всю сложную хуйню скрываешь за ним.

from abc import ABC, abstractmethod
class DatabaseConnector(ABC):  # Абстрактная хрень, типа «любой соединитель с БД»
    @abstractmethod
    def connect(self):
        pass  # Детали, блядь, реализации — где-то там, в другом месте. Мне похуй.

Вот и вся ООП, блядь. Ничего страшного. Просто способ организовать код так, чтобы он не превращался в спагетти, где всё связано со всем и при изменении одной строчки летит в пизду вся программа. Хотя, конечно, и с ООП можно так наговнокодить, что сам черт ногу сломит. Но это уже другая история, ёпта.