Введение в ООП

Парадигмы программирования

Существует несколько парадигм программирования, вот основные:

  1. Императивное программирование — программа это последовательность инструкций, которые выполняются по порядку

def sum_list(lst):
    total = 0
    for num in lst:
        total += num
    return total
  1. Функциональное программирование — программа это набор функций, которые работают с данными используя входные и выходные параметры

import functools

def sum_list(lst):
    return functools.reduce(lambda x, y: x + y, lst)
  1. Объектно-ориентированное программирование — программа представляется в виде объектов, которые содержат данные и методы для их обработки. Основная идея — объекты являются сущностями, которые существуют самостоятельно и могут взаимодействовать друг с другом

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