Объектно-ориентированное программирование

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

Императивное программирование — описание задачи в виде кода последовательности действий, которые выполняются друг за другом, данные от действия к действию передаются с помощью переменных.

Структурное программирование - позволяет использовать в коде ветвления и циклы, что позволяет достигать результата за меньшее количество строк кода.
Процедурное программирование - добавляет абстракцию в программирование с помощью процедур. Можно выделить кусок кода, который логически составляет единое целое и вынести его отдельно, назвав одним словом. Дальше использовать это имя, где необходимо повторить вынесенный код. В дальнейшем процедуры научились принимать параметры и возвращать результат работы.

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

В ООП представлены следующие концепции:
- Инкапсуляция
- Полиморфизм
- Наследование
Инкапсуляция — это описание данных и поведения одной сущности в объект. Инкапсуляция это борьба со сложностью и создание абстракций в виде объектов.

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

Наследование — способность в коде создавать шаблоны для объектов на основе других более абстрактных шаблонов. Одни и те же классы могут быть потомками одних классов и при этом являться предками для других — выстраивая иерархию.
Пример объявления класса
class Person():

    courses: int = 1 # Параметр класса

    def __init__(self, first_name: str, last_name: str): # Конструктор класса
        self.first_name = first_name
        self.last_name = last_name

    @property
    def info (self) -> str: # Свойство Класса
        return f'{first_name} {last_name}'

    def set_courses(self, courses: int) -> None:
        self.courses = courses

    def get_courses(self) -> int:
        return self.courses

    def jump(self) -> None:
        self.courses +=1
описание кода
При создании экземпляра класса объект получает его структуру. Каждый экземпляр имеет собственное значение параметров, данная реализация называется Инстанцированием.

Метод __init__ отвечает за инициализацию экземпляров класса после их создания.

Свойство класса позволяет получить атрибут, значение которого вычисляется динамически. Для его реализации необходимо указать декоратор @property у метода, который не принимает параметров
Пример экземпляров класса
kate = Person('Екатерина', 'Иванова')

max = Person('Максим', 'Петров')

print(kate.info) #Екатерина Иванова
print(max.info) #Максим Петров
Работа со свойствами
Метод info является свойством класса. Можно реализовать метод изменения данного свойства, он называется сеттером.
Сеттер
    @info.setter
    def info(self, new: str):
        self.first_name, self.last_name = new.split(' ')

# Теперь можно менять Фамилию и Имя используя способность изменять свойства

kate.info = 'Екатерина Петровна'
Модуль Dataclasses
Модуль предоставляет декораторы и функции для работы с классами. Данный модель позволяет сократить код при описании класса.

Декоратор dataclass()проверяет класс, чтобы найти параметры. Параметры определяются как переменные класса, имеющая аннотацию типа .


Порядок полей во всех сгенерированных методах соответствует порядку, в котором они появляются в определении класса.

dataclasses() - Данный декоратор добавит в класс различные «dunder»-методы, описанные ниже.

Полное описание модуля
Пример объявления класса
from typing import ClassVar
from dataclasses import dataclass

@dataclasses
class Person():

    first_name: str
    last_name: str
    courses: ClassVar = 1 # Внутренний параметр, не передается при создании экземпляров

    @property
    def info (self) -> str: # Свойство Класса
        return f'{first_name} {last_name}'

    def set_courses(self, courses: int) -> None:
        self.courses = courses

    def get_courses(self) -> int:
        return self.courses

    def jump(self) -> None:
        self.courses +=1
Пример кода учебного проекта
Модуль расчёта и отображения полной информации о тренировках по данным от блока датчиков.

Задача
Реализовать программный модуль по методологии ООП для расчёта и отображения информации
о прошедшей тренировке по данным от блока датчиков.

Описание задачи в файле ReadME

Решение задания