Что такое ООП?

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

Какие базовые принципы ООП?

В ООП есть 3 основных принципа: инкапсуляция, полиморфизм, наследование. Можно назвать еще 1 — абстракция. Абстракция — в коде используем только те характеристики объекта, которые нужны в этом коде (у объекта в реальном мире может быть 100500 характеристик, но в коде мы от этого абстрагируемся и используем только то, что нам нужно сейчас). Наследование — 1 класс может строиться на основе другого. 1 будет родительским, другой дочерним. Дочерний класс получает всё от родительского (поля, методы). Инкапсуляция — есть 2 определения:

  1. фундаментально инкапсуляция образуется от слова «инкапсула» - в класс должны поместить все поля и методы, которые связаны общей идеей. Мы их инкапсулируем в класс и от класса работаем с этим.
  2. «Про сокрытие данных» - в классе могут быть private и protected атрибуты. Из класса не должно торчать наружу всё то, что не должно торчать. Наружу уходит только тот интерфейс, который нужен пользователю. Полиморфизм — есть 2 определения:
  3. В функции нам плевать на типы данных аргументов, которые к нам прилетают. Главное, чтобы в этом аргументе был реализован весь интерфейс, с которым работает функция (канонический параметрический полиморфизи/утиная типизация)
  4. В дочерних классах мы можем перегружать родительские методы, модифицируя их функционал. То есть класс должен работать как с объектом родительского класса, так и с объектом дочернего класса, но функционал может отличаться (определение Бьёрна Страуструпа).

ООП, self

Класс — шаблон для уникальных экземпляров Объект — уникальный экземпляр какой-то сущности/класса В методах используются self, csl как ссылки на текущий объект/класс self: чтобы в методе понять к какому объекту он относится, методы объекта первым аргументом принимают self. self — ссылка на текущий объект csl — ссылка на текущий класс

Зачем нужен метод super в классах?

super нужен для доступа к родительским классам, когда есть наследование. К родительским методам, когда дочерняя может быть перегружена. По сути super — ссылка на объект родительской сущности. super очень часто используется в родительских методах (например в __init__.py, когда нужно пробросить аргументы в родительский конструктор)

Как в классе реализуются методы объекта, класса и статические методы? Чем они отличаются?

Методы объекта доступны только через объект Методы класса и статические методы можно использовать без объекта.

@classmethod (метод класса):