ВУЗ: Не указан
Категория: Не указан
Дисциплина: Не указана
Добавлен: 07.11.2023
Просмотров: 73
Скачиваний: 1
ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
-
В родительском классе (в нашем случае – класс Дом) создают пустой метод (например, метод Построить()) и делают его абстрактным (то есть с помощью специального служебного слова обозначаем его таким. -
В классах-потомках создают одноименные методы, но уже с соответствующей реализацией, так как процессы постройки Частного и Многоквартирного дома отличаются кардинально. К примеру, для строительства Многоквартирного дома необходимо задействовать башенный кран, а Частный дом можно построить и собственными силами. При этом данный процесс все равно остается процессом строительства. -
В итоге получаем метод с одним и тем же именем, который встречается во всех классах. В родительском - имеем только интерфейс, реализация отсутствует. В классах-потомках - имеем и интерфейс, и реализацию. Причем в отличие от родительского класса реализация в потомках уже становится обязательной. -
Теперь реализуется преимущество полиморфизма. Для любого объекта из двух классов-потомков можно, не задумываясь о том, объектом какого класса он является, достаточно просто вызвать метод Построить(). А уже в момент исполнения программы, когда при создании объекта будет указано, объект какого класса создаётся, у этого объекта будет вызываться соответствующая этому классу реализация метода Построить() (рисунок 1.5).
Рисунок 1.5. Иллюстрация полиморфизма
Как итог - за одинаковым названием могут скрываться методы с совершенно разным функционалом, который в каждом конкретном случае соответствует нуждам класса, к которому он относится.
В языке Python ООП полтморфизм играет ключевую роль. Даже программируя в рамках структурной парадигмы, вы все равно пользуетесь объектами и классами, пусть даже встроенными в язык, а не созданными лично вами.
1.6 Краткий обзор терминологии ООП
-
Класс — определенный пользователем прототип для объекта, который определяет набор атрибутов, которые характеризуют любой объект класса. Атрибутами являются члены данных (переменные класса и переменные экземпляра) и методы, доступ к которым осуществляется через точечную запись. -
Переменная класса — переменная, которая используется всеми экземплярами класса. Переменные класса определены внутри класса, но вне любого из методов класса. Переменные класса используются не так часто, как переменные экземпляра. -
Член данных — переменная класса или переменная экземпляра, которая содержит данные, связанные с классом и его объектами. -
Перегрузка функций — назначение более чем одного поведения определенной функции. Выполняемая операция варьируется в зависимости от типов объектов или аргументов. -
Переменная экземпляра — переменная, которая определена внутри метода и принадлежит только текущему экземпляру класса. -
Наследование — передача характеристик класса другим классам, которые являются его производными. -
Экземпляр — индивидуальный объект определенного класса. Например, объект obj, принадлежащий классу Circle, является экземпляром класса Circle. -
Instantiation (инстанация)— создание экземпляра класса. -
Метод — особый вид функции, который определен в определении класса. -
Объект — уникальный экземпляр структуры данных, который определяется его классом. Объект включает в себя как члены данных (переменные класса и переменные экземпляра), так и методы. -
Перегрузка оператора — назначение более чем одной функции определенному оператору.
1.7 Понятие «объект класса»
Объект — автономная единица кода, состоящая из атрибутов: данных и методов, которые оперируют атрибутами данных.
Объект - это программная сущность, которая содержит данные и процедуры. Находящиеся внутри объекта данные называются атрибутами данных. Это просто переменные, которые ссылаются на данные.
Выполняемые объектом процедуры называются методами. Методы объекта - это функции, которые выполняют операции с атрибутами данных.
Инкапсуляция обозначает объединение данных и программного кода в одном объекте, и это позволяет скрывать эти данные от других объектов. Сокрытие данных связано со способностью объекта скрывать свои атрибуты данных от программного кода, который находится за пределами объекта.
Только методы объекта могут непосредственно получать доступ и вносить изменения в атрибуты данных объекта.
Объект, как правило, скрывает свои данные, но можно организовать доступ из внешнего кода к методам объекта. Отмеченная ситуация отображена на рисунке 1.6. Таким образом методы объекта позволяют программным инструкциям за пределами объекта получить косвенный доступ к атрибутам данных объекта.
Рисунок1.6
Сокрытие (инкапсуляция) данных объекта от внешнего кода, и ограничение доступа к ним через методы этого объекта защищает их от случайного повреждения. Кроме того, программному коду за пределами объекта не нужно знать о формате или внутренней структуре данных объекта, поскольку он взаимодействует только с методами объекта.
Изменение структуры внутренних атрибутов объекта требует изменения методов объекта, чтобы они могли должным образом оперировать данными.
Однако приемы взаимодействия внешнего кода с методами объекта при этом не меняются.
1.8 Особенности реализации ООП в Python
Реализация ООП в Python имеет свои особенности, которые надо учитывать при программировании. Отчасти это обусловлено тем, что Python – язык с динамической типизацией. В частности, если в C++ описание класса — это лишь объявление, а в питоне — это создание объекта.
Таким образом, класс в Python – это своеобразный объект, который является пользовательским типом и шаблоном для создания других объектов этого типа. Классы предоставляют средства объединения данных и функциональности вместе. Создание нового класса создает
объект нового типа, позволяя создавать новые экземпляры этого типа.
В отличие от других языков ООП, в которых используются понятия класс и его объекты, в Python корректно говорить об объекте-классе и, создаваемых на его основе экземплярах этого класса.
Класс - это программный код, который задает атрибуты данных и методы объекта определенного типа. Это описание ещё не созданного объекта.
При этом класс становится новым типом данных в рамках разрабатываемой программы.
К каждому экземпляру класса могут быть прикреплены атрибуты для поддержания его состояния.
То есть можно создавать переменные этого нового типа. Такие переменные называются или экземплярами данного типа!
В Python в отличие от других языков, поддерживающих ООП, методы и данные объектов носят общее название атрибутов. Экземпляры класса также могут иметь все или некоторые методы (определенные его классом) для изменения его состояния (рисунок 1.7).
Наконец, в Python нет классической инкапсуляции, как она понимается в смысле сокрытия данных, хотя она является одним из стандартов ООП. В Python можно получить доступ к любому атрибуту объекта и изменить его. Однако есть механизм, позволяющий имитировать сокрытие данных, если это так уж необходимо. Отсутствие сокрытия данных в Python делает программирование на нем проще, но привносит ряд особенностей, связанных с пространствами имен.
По сравнению с другими распространенными языками программирования у Python можно выделить следующие особенности, связанные с объектно-ориентированным программированием:
-
Любое данное (значение) — это объект. Число, строка, список, массив и др. — все является объектом. Бываю объекты встроенных классов (как те ,что перечисленные в предыдущем предложении), а бывают объекты пользовательских классов (тех, что создает программист). Для единого механизма взаимодействия предусмотрены методы перегрузки операторов. -
Класс — это тоже объект с собственным пространством имен. Это нигде не было указано в данном цикле уроков. Однако это так. Поэтому правильнее было употреблять вместо слова «объект», слово «экземпляр». И говорить «экземпляр объекта», подразумевая под этим созданный на основе класса именно объект, и «экземпляр класса», имея ввиду сам класс как объект. -
Инкапсуляции в Python не уделяется особого внимания. В других языках программирования обычно нельзя получить напрямую доступ к свойству, описанному в классе. Для его изменения может быть предусмотрен специальный метод. В Python же это легко сделать, просто обратившись к свойству класса извне. Несмотря на это в Python все-таки предусмотрены специальные способы ограничения доступа к переменным в классе.
Рисунок 1.7
По сравнению с другими языками программирования, механизм классов Python добавляет классы с минимальным количеством нового синтаксиса и семантики.
1.9 Взаимосвязь класса как объекта с его экземплярами
В дополнение к решению проблем разделения программного кода и данных, применение ООП реализовало технологию многократного использование объектов.
В Python это реализовано через создание нового объекта, называемого КЛАССОМ.
Понимание содержания класса можно представить следующим образом.
Представьте класс как "строительный проект", на основе которого будут возводиться объекты.
Класс выполняет аналогичные задачи, что и проект дома. Сам проект не является домом, он является подробным описанием дома. Когда для возведения реального дома используется строительный проект, обычно говорят, что типовой дом (экземпляр дома) возводится согласно проекту. По желанию заказчика может быть построено несколько идентичных зданий на основе одного и того же проекта.
Каждый возведенный дом является отдельным экземпляром дома, описанного в проекте. Эта идея проиллюстрирована на рис.1.8.
Объект или экземпляр класс – это то, что инициализировано по описанию класса, то что имеет описание, структуру и поведение класса.
Рис.1.8. Проект (класс) и дома (объекты), возведённые по данному проекту.
Можно дать ещё одно образное описание.
Класс – это что-то вроде чертежа объекта, т.е. прежде чем мы создадим какую-то деталь, проектировщик должен сделать ее чертеж. Написать, что у этой детали будут такие-то свойства (высота, ширина, длина). Когда чертеж будет выполнен, мы отдаем его какому-то мастеру, и он уже создает экземпляры из этого класса. Деталей, которые могут быть созданы из этого чертежа огромное количество.
Итак, класс - это описание свойств объекта. Когда программа работает, она может использовать класс-объект для создания в оперативной памяти такого количества экземпляров этого типа, какое понадобится. Каждый объект, который создается на основе класса, называется экземпляром класса.
Итак, класс у нас один, а экземпляров этого класса, объектов может быть огромное количество.
И нужно понимать, что:
-
Чертеж НЕ равно деталь -
Класс НЕ равно объект
Общий алгоритм работы с объектно-ориентированным подходом в программировании выглядит так:
-
Создали класс. -
Создали экземпляр класса. -
Обращаемся к свойствам и методам экземпляра класса.
1.10 Создание (определение) класса и его экземпляров
1.10.1 Определение класса, понятие и использование конструктора класса
1.10.1.1 Определение класса
Класс описывается с помощью ключевого слова (инструкции) class по следующей схеме:
class <Название класса> [(<Класс1>, ..., <Класс№>)]:
""" Строка документирования """
<Описание атрибутов и методов>
Инструкция в целом создает новый объект и присваивает ссылку на него идентификатору, указанному после ключевого слова class. Это означает, что название класса должно полностью соответствовать правилам именования переменных.
После названия класса в круглых скобках можно указать один или несколько базовых классов через запятую. Таким образом создаваемый класс будет наследником классов, указанных в круглых скобках.
Если же класс не наследует базовые классы, то круглые скобки можно не указывать.
Можно создать минимальный пустой класс. В таком случае подставляют pass (рисунок 1.9).
Рисунок 1.9. Класс с минимальным телом pass и его экземпляр
К именам классов применимы те же самые правила, которые применимы к именам переменных. Однако рекомендуется писать имя класса, начиная с заглавной буквой. Такое написание необязательно. Оно является широко распространенным среди программистов соглашением о наименовании классов. При чтении программного кода такое написание помогает легко отличать имена классов от имен переменных.
Следует заметить, что все выражения внутри инструкции class выполняются при создании класса, а не его экземпляра. Для примера создадим класс, внутри которого просто выводится сообщение (Рисунок 1.10):
Рисунок 1.10
Этот пример содержит лишь определение класса Myclass_1 и не создает экземпляр класса. Как только поток выполнения достигнет инструкции class, сообщение, указанное в функции print(), будет сразу выведено.