Skip to content

Latest commit

 

History

History
45 lines (38 loc) · 4.04 KB

File metadata and controls

45 lines (38 loc) · 4.04 KB

Принципы ООП

Инкапсуляция

Каждый класс - черный ящик, и он изолирован от внешего воздействия (то есть напрямую извне поменять невозможно).
Мы не знаем, что в нем происходит, и просто обращаемся к нему через публичные методы.
К состоянию (приватные переменные) объекта имеет доступ только сам объект.
То есть, только сам объект может себя изменить, и дает только удобные публичные методы для работы с ним.
Таким образом, мы разделяем ответственность, и при обращении к классу через интерфейс не поломаем всю программу.

Note

В Python это реализовано в виде __name для приватных полей и _name для защищенных (для чтения).
Чаще в Python особо не заморачиваются и просто пишут _name, чтобы обозначить, что это для внутреннего использования.
Однако в Python это лишь соглашение, и при желании можно все сломать.
(Единственный нюанс, атрибут класса
Base.__name автоматически переименовывается в
Base._Base__name - но она все равно доступна, просто доступ затруднен)

Абстракция

Абстракция - принцип отделения концепции (общего) от конкретной реализации.
Мы выделяем общую суть, игнорируя детали (например, выносим общую логику в абстрактный класс).

Note

В Python для создания абстрактного класса нужно унаследовать класс ABC из модуля abc

А чтобы создать абстрактную функцию (обязательную к переопределению наследниками), нужно обернуть ее в декоратор @abstractmethod

from abc import ABC, abstractmethod

Наследование

Наследование - возможность порождать один класс от другого с сохранением всех свойств и методов класса-предка, добавляя при необходимости новые свойства и методы (свои уникальные детали).
Во главе иерархии пирамидки наследования - нечто общее для всех. А дальше - чем ниже, тем больше наращиваются уникальные для конкретно этого случая детали.
Главная цель: избежать дублирования кода.

Полиморфизм

Полиморфизм - возможность объектов с одинаковой спецификацией иметь различную реализацию.
Одна спецификация - разная реализация.
Наследник может выполнять команду базового класса у себя под капотом по-своему

(разные классы могут иметь одну и ту же функцию,
которая работает у каждого по-разному
или класс-наследник от базового класса, может интерфейса,
переопределяет функцию и прописывает ее логику совсем по-другому).