Weqfqefqeff
qwefqewfqf
Python
ПРОЦЕДУРНОЕ И
ОБЪЕКТНООРИЕНТИРОВАННОЕ
ПРОГРАММИРОВАНИЕ
Содержание
Приобретайте
профессиональные
навыки!
Что такое ООП?
Вы наверняка слышали, что существуют два главных подхода к написанию
программ:
1. Процедурное программирование
2. Объектно-ориентированное программирование (оно же ООП)
Оба подхода объединены общей целью - сделать процесс программирования
максимально эффективным. Это значит, что благодаря им разработка
программного обеспечения становится более простой для понимания, легко
масштабируемой и содержащей минимальное количество ошибок.
По сути любая программа представляет собой
совокупность данных и операций по их обработке. Но что важнее, сами данные
или операции над ними? В языках, в основе работы которых лежит
принцип процедурного программирования (Basic, C, Pascal, Go), главным
является код для обработки данных. При этом сами данные имеют
второстепенное значение.
Процедурное программирование. Работа с данными.
В чем суть процедурного подхода? Процедурное программирование – это
написание функций и их последовательный вызов в некоторой главной(main)
функции.
Для каких проектов подходит процедурное программирование? Идеальные
условия для применения данного подхода - простые программы, где весь
функционал можно реализовать несколькими десятками процедур/функций.
Функции аккуратно вложены друг в друга и легко взаимодействуют посредством
передачи данных из одной функции в другую.
Однако проблема в том, что когда мы выходим за пределы этих идеальных
условий, выплывают наружу многие недостатки данного подхода:
1. В больших проектах приходится создавать огромное количество
процедур и функций. В свою очередь, это неизбежно ведет к
возникновению множества ошибок и снижает читаемость кода
программы.
2. Все данные внутри процедуры видны только локально, а значит их
нельзя использовать в другом месте. Как следствие, код наполняется
дубликатами.
3. Высокий порог вхождения - по статистике начинающим данный поход
дается сложнее, чем ООП.
Долгое время процедурный подход был довольно популярным и считался самым
прогрессивным. Однако объемы кода программ росли, и ему на смену пришло
объектно-ориентированное программирование. Вот как определяет данный
подход Википедия:
Объектно-ориентированное программирование (ООП) — методология
программирования, основанная на представлении программы в виде
совокупности объектов, каждый из которых является экземпляром
определённого класса, а классы образуют иерархию наследования.
В основе ООП лежит простая и элегантная идея, в соответствии с которой главное
в программе - это данные. Именно они определяют, какие методы будут
использоваться для их обработки. Т. е. данные первичны, код для обработки этих
данных - вторичен.
Объектно-ориентированное программирование. Работа с данными.
Итак, чем же хорош подход ООП?
1. Программа разбивается на объекты. Каждый объект отвечает за
собственные данные и их обработку. Как результат - код становится
проще и читабельней.
2. Уменьшается дупликация кода. Нужен новый объект, содержимое
которого на 90% повторяет уже существующий? Давайте создадим новый
класс и унаследуем эти 90% функционала от родительского класса!
3. Упрощается и ускоряется процесс написания программ. Можно сначала
создать высокоуровневую структуру классов и базовый функционал, а
уже потом перейти к их подробной реализации.
Подытожим
1. В процедурном подходе основой программы является функция. Функции
вызывают друг друга и при необходимости передают данные. В
программе функции живут отдельно, данные — отдельно.
2. Основной недостаток процедурного подхода - сложность создания и
поддержки больших программ. Наличие сотен функций в таких проектах
очень часто приводит к ошибкам и спагетти-коду.
3. В основе объектно-ориентированного программирования лежит понятие
объекта. Объект совмещает в себе и функции и данные.
4. Основное преимущество ООП перед процедурным программированием -
изоляция кода на уровне классов, что позволяет писать более простой и
лаконичный код.
Теория
ООП. КЛАССЫ=СВОЙСТВА+МЕТОДЫ
Содержание
Приобретайте
профессиональные
навыки!
Объекты и классы в ООП
Мир, в котором мы живем, состоит из объектов. Это деревья, солнце, горы, дома,
машины, бытовая техника. Каждый из этих объектов имеет свой набор
характеристик и предназначение. Несложно догадаться, что именно объектная
картина реального мира легла в основу ООП.
Класс — в объектно-ориентированном программировании, представляет
собой шаблон для создания объектов, обеспечивающий начальные значения
состояний: инициализация полей-переменных и реализация
поведения функций или методов.
Объект — некоторая сущность в цифровом пространстве, обладающая
определённым состоянием и поведением, имеющая определенные свойства
(поля) и операции над ними (методы). Как правило, при рассмотрении
объектов выделяется то, что объекты принадлежат одному или нескольким
классам, которые определяют поведение (являются моделью) объекта.
Термины «экземпляр класса» и «объект» взаимозаменяемы.
На что необходимо обратить внимание?
1. Класс описывает множество объектов, имеющих общую структуру и
обладающих одинаковым поведением. Класс - это шаблон кода, по
которому создаются объекты. Т. е. сам по себе класс ничего не делает, но
с его помощью можно создать объект и уже его использовать в работе.
2. Данные внутри класса делятся на свойства и методы. Свойства
класса (они же поля) - это характеристики объекта класса.
3. Методы класса - это функции, с помощью которых можно оперировать
данными класса.
4. Объект - это конкретный представитель класса.
5. Объект класса и экземпляр класса - это одно и то же.
Грубо говоря
Класс = Свойства + Методы
Рассмотрим простой пример. Перед нами класс "Автомобиль". Если мыслить
абстрактно, то он представляет собой набор чертежей и инструкций, с помощью
которых можно собрать машину. При этом каждая машина, которую мы будем
собирать, должна обладать рядом характеристик, которые соответствуют нашему
классу. Как мы уже выяснили, данные характеристики - называются свойствами
класса и в нашем примере могут быть следующими:
1. Цвет
2. Объем двигателя
3. Мощность
4. Тип коробки передач
Так же наш автомобиль может выполнять какие-то действия, характерные для
всего класса. Эти действия, как мы теперь знаем, есть методы класса, и
выглядеть они могут вот так:
1. Ехать
2. Остановиться
3. Заправиться
4. Поставить на сигнализацию
5. Включить дворники
Начинка класса готова, теперь можно переходить к созданию объектов.
Что общего будет в объектах? Все объекты создаются по одному шаблону, то
есть на выходе обязательно будут машины, никаких велосипедов и мотоциклов.
Они будут выкрашены в какой-то цвет, ехать они будут за счет наличия в них
двигателя, скорость будет регулироваться с помощью коробки передач. Также
объекты данного класса будут обладать одинаковыми методами - все машины
этого класса будут ездить, периодически им будет нужна заправка, а от угона они
будут защищены установкой сигнализации.
ООП. Класс Автомобиль.
Но в чем разница? Значения свойств будут различаться. Одна машина красная,
другая - зеленая. У одной объем двигателя 1968 см3 и коробка-робот, а у другой -
1395 см3 и ездить владельцу придется на механике.
Вывод: Объекты класса на выходе похожие и одновременно разные.
Различаются, как правило, свойства. Методы остаются одинаковыми.
Пример созданного объекта "Автомобиль Volkswagen Tiguan":
1. Свойства: Цвет="Белый", Объем двигателя="1984 см3", Мощность="180
л.с.", Тип коробки передач="Робот"
2. Методы: Ехать, Остановиться, Заправиться, Поставить на сигнализацию,
Включить дворники
Теория
АТРИБУТЫ КЛАССА
Содержание
Приобретайте
профессиональные
навыки!
Что такое атрибуты класса в Python
Давайте договоримся, что атрибутом класса/объекта мы будем называть любой
элемент класса/объекта (переменную, метод, подкласс), на который мы можем
сослаться через символ точки. Т. е. вот
так: MyClass.<атрибут> или my_object.<атрибут>.
Все атрибуты можно разделить на 2 группы:
1. Встроенные(служебные) атрибуты
2. Пользовательские атрибуты
Предлагаем отдельно поговорить о каждой из этих групп:
1. Встроенные атрибуты
Называть данную группу атрибутов встроенными - это своего рода условность, и
сейчас мы объясним почему. Суть в том, что на самом деле все классы в Python
(начиная с 3-й версии) имеют один общий родительский класс - object. Это значит,
что когда вы создаете новый класс, вы неявно наследуете его от класса object, и
потому свежесозданный класс наследует его атрибуты. Именно их мы и называем
встроенными(служебными). Вот некоторые из них (заметьте, что в списке есть как
поля, так и методы):
Атрибут Назначение Тип
__new__(cls[, ...]) Конструктор. Создает Функция
экземпляр(объект) класса. Сам
класс передается в качестве
аргумента.
__init__(self[, ...]) Инициализатор. Принимает Функция
свежесозданный объект класса из
конструктора.
Атрибут Назначение Тип
__del__(self) Деструктор. Вызывается при Функция
удалении объекта сборщиком
мусора
__str__(self) Возвращает строковое Функция
представление объекта.
__hash__(self) Возвращает хэш-сумму объекта. Функция
__setattr__(self, attr, Создает новый атрибут для объекта Функция
val) класса с именем attr и значением
val
__doc__ Документация класса. Строка
(тип str)
__dict__ Словарь, в котором хранится Словарь
пространство имен класса (тип dict)
Это важно
В теории ООП конструктор класса - это специальный блок инструкций, который
вызывается при создании объекта. При работе с питоном может возникнуть
мнение, что метод __init__(self) - это и есть конструктор, но это не совсем так. На
самом деле, при создании