Каждый класс - черный ящик, и он изолирован от внешего воздействия (то есть напрямую извне поменять невозможно).
Мы не знаем, что в нем происходит, и просто обращаемся к нему через публичные методы.
К состоянию (приватные переменные) объекта имеет доступ только сам объект.
То есть, только сам объект может себя изменить, и дает только удобные публичные методы для работы с ним.
Таким образом, мы разделяем ответственность, и при обращении к классу через интерфейс не поломаем всю программу.
Note
В Python это реализовано в виде __name для приватных полей и _name для защищенных (для чтения).
Чаще в Python особо не заморачиваются и просто пишут _name, чтобы обозначить, что это для внутреннего использования.
Однако в Python это лишь соглашение, и при желании можно все сломать.
(Единственный нюанс, атрибут класса
Base.__name автоматически переименовывается в
Base._Base__name - но она все равно доступна, просто доступ затруднен)
Абстракция - принцип отделения концепции (общего) от конкретной реализации.
Мы выделяем общую суть, игнорируя детали (например, выносим общую логику в абстрактный класс).
Note
В Python для создания абстрактного класса нужно унаследовать класс ABC из модуля abc
А чтобы создать абстрактную функцию (обязательную к переопределению наследниками), нужно обернуть ее в декоратор @abstractmethod
from abc import ABC, abstractmethodНаследование - возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка,
добавляя при необходимости новые свойства и методы (свои уникальные детали).
Во главе иерархии пирамидки наследования - нечто общее для всех.
А дальше - чем ниже, тем больше наращиваются уникальные для конкретно этого случая детали.
Главная цель: избежать дублирования кода.
Полиморфизм - возможность объектов с одинаковой спецификацией иметь различную реализацию.
Одна спецификация - разная реализация.
Наследник может выполнять команду базового класса у себя под капотом по-своему
(разные классы могут иметь одну и ту же функцию,
которая работает у каждого по-разному
или класс-наследник от базового класса, может интерфейса,
переопределяет функцию и прописывает ее логику совсем по-другому).