Введение в ООП
Парадигмы программирования
Существует несколько парадигм программирования, вот основные:
Императивное программирование — программа это последовательность инструкций, которые выполняются по порядку
def sum_list(lst):
total = 0
for num in lst:
total += num
return total
Функциональное программирование — программа это набор функций, которые работают с данными используя входные и выходные параметры
import functools
def sum_list(lst):
return functools.reduce(lambda x, y: x + y, lst)
Объектно-ориентированное программирование — программа представляется в виде объектов, которые содержат данные и методы для их обработки. Основная идея — объекты являются сущностями, которые существуют самостоятельно и могут взаимодействовать друг с другом
class List:
def __init__(self, lst):
self.lst = lst
def sum(self):
total = 0
for num in self.lst:
total += num
return total
# Создаем экземпляр класса
my_list = [1, 2, 3, 4, 5]
my_obj = List(my_list)
# Вызываем метод sum()
result = my_obj.sum()
print(result)
Иногда рассматривают ещё методы программирования. И выделяют два основных метода: процедурный и объектно-ориентированный.
Процедурное программирование — метод написания программного обеспечения, в центре внимания которой находятся процедуры или действия, происходящие в программе.
Основой объектно-ориентированного программирования служат объекты, объединяющие данные и функции.
Понятие ООП
Объект — это программная сущность, которая содержит данные и процедуры. Находящиеся внутри объекта данные называются атрибутами данных. Выполняемые объектом процедуры называются методами. Методы объекта — это функции, которые выполняют операции с атрибутами данных.
То есть, объект можно представлять как автономную единицу, которая состоит из атрибутов данных и методов, которые оперируют атрибутами данных. Методы могут напрямую не взаимодействовать с атрибутами, но всегда совершают какое-либо действие своего объекта.

Например, у объекта "автомобиль" есть атрибуты: марка, модель, год выпуска и методы : припарковать, посигналить, открыть дверь.
Интерактив:
Приведите примеры объктов из реальной жизни с атрибутами и методами. Как с ними можно взаимодействовать? Как можно изменить атрибуты объекта?
Принцип инкапсуляции — объединение данных и программного кода в одном объекте. Включает в себя сокрытие данных — атрибуты объекта можно изменять только при помощи методов, которые мы определили и за их пределами доступа к атрибутам нет.
Когда меняются данные объекта, программист меняет реализацию методов этого объекта. При этом снаружи взаимодействие с объектом остается прежним. Например, есть объект "велосипед" и у него метод "затормозить". Мы можем поменять внутреннее устройство тормоза, но внешний интерфейс — нажатие ручки тормоза, лучше оставить прежним.
Пример объекта из повседневной жизни
Пусть будильник — программный объект. У него есть атрибуты:
current_second # текущая секунда, значение в диапазоне 0-59
current_minute # текущая минута, значение в диапазоне 0-59
current_hour # текущий час, значение в диапазоне 1-12
alarm_time # время сигнала, допустимые час и минута
alarm_is_set # будильник включен - истина или ложь
Мы видим, что атрибуты — это всего лишь значения они определяют состояние, в котором будильник находится в настоящее время. Мы, как пользователи, не можем напрямую манипулировать этими атрибутами данных, необходимо применить один из методов объекта
Некоторые методы объекта "будильник"
set_time # задать время
set_alarm_time # задать время сигнала
set_alarm_on # включить будильник
set_alarm_off # выключить будильник
При помощи этих методов мы, пользователи, можем манипулировать атрибутами объекта "будильник". То есть эти методы "выставлены наружу" и являются публичными
Есть также приватные методы — закрытые от внешних сущностей (нас) и являющиеся частью приватного, внутреннего устройства объекта.
# приватные методы
increment_current_second() # прирастить текущую секунду
increment_current_minute() # прирастить текущую минуту
increment_current_hour() # прирастить текущий час
sound_alarm() # подать звуковой сигнал
Интерактив:
Что такое объект?
Что такое инкапсуляция?
Почему внутренние данные объекта обычно скрыты от внешнего программного кода?
Что такое публичные методы? Что такое приватные методы?
Классы
Класс — это шаблон, определяющий характеристики для объектов
Экземпляры — объекты определенного класса

Параметр self означает, что он применяется для конкретного экземпляра. То есть мы создали класс, в нем определили метод с параметром self и вызывая этот метод для экземпляра класса и применяя self.x мы используем x для этого конкретного экземпляра. Это и значит self.
Посмотреть атрибуты и методы любого объекта — dir(объект)

Жизненный цикл объектов

Конструктор — то, что надо сделать при создании экземпляра класса. Деструктор — то, что надо сделать при удалении экземпляра класса
Наследование
Вместо создания класса с нуля, можно сделать это уже от существующего класса — так создаются подклассы

Класс FootballFan
наследует всё от родительского класса и плюс в его пространстве имён есть внутренние объекты

Last updated