Основные принципы ООП

ООП - Объектно Ориентированное Программирование - является одной из наиболее популярных парадигм (подходов) программирования на сегодняшний день. Оно основывается на нескольких важных принципах:

Класс - описание какой-либо сущности, её состояния и поведения (Можно сказать, "чертёж" объекта).

Как можно написать класс в Python?

class Phone:
    # тут будут поля и методы

Объект - готовая сущность, построенная на основе класса (Например, объект "iPhone" построенный на основе класса-чертежа "Phone").

Как создать объект в Python?

iPhone = Phone(
    # сюда, возможно, передадим свойства объекта
)

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

Метод - определённое действие, которое может совершить объект. Например, телефон может зазвонить ("ring").

Как определить метод для класса?

class Phone:
    def ring(self):
        print("B-z-z-z!")  # Любой телефон делает Б-з-з!

Вы можете заметить параметр self у метода ring. этот параметр Python передаёт самостоятельно, когда мы вызываем этот метод у какого-либо конкретного объекта:

iPhone = Phone()

iPhone.ring()  # Внутри ring self станет равен переменной iPhone

Кроме обычных методов класса, которые придумываем мы сами, существуют также "специальные" методы, у них специальные названия, начинающиеся и заканчивающиеся двумя подчеркиваниями ("__", так называемый "dunder" - "double underscore" - двойное подчёркивание). Их можно определить для любого объекта в Python:

Например, метод, который даёт нам представление телефона в виде строки:

class Phone:
    def __str__(self):
        # self.volume - обращаемся к конкретному объекту,
        # для которого мы вызвали этот метод.
        # в данном случае хотим получить его громкость.
        return f"Это телефон. Его громкость - {self.volume}"

Ещё нам позволяется передавать параметры нового создаваемого объекта сразу при написании Phone(), внутрь скобок. Для этого в Python существует специальный метод __init__, называемый конструктором. он описывается так:

class Phone:
    def __init__(self, name):
        self.name = name  # ставим название новому телефону

А вызывается так:

p = Phone('iPhone X')
print(p.name)  # Выведет 'iPhone X'