fbpx

Каталог статей

Каталог статей для размещения статей информационного характера

Как выучить

Объектно-ориентированное программирование (ООП) в Python 3

Объектно-ориентированное программирование (ООП) в Python 3

Смотреть сейчас К этому учебнику прилагается видеокурс, созданный командой Real Python. Смотрите его вместе с письменным учебником, чтобы углубить свое понимание: Введение в объектно-ориентированное программирование (ООП) в Python

Объектно-ориентированное программирование (ООП) – это метод структурирования программы путем объединения связанных свойств и поведения в отдельные объекты. В этом учебнике вы узнаете основы объектно-ориентированного программирования в Python.

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

Объект содержит данные, например, сырье или предварительно обработанные материалы на каждом этапе сборочной линии, и поведение, например, действия, которые выполняет каждый компонент сборочной линии.

В этом учебном пособии вы узнаете, как:

  • Создавать класс, который является как бы чертежом для создания объекта.
  • Использовать классы для создания новых объектов
  • Моделировать системы с помощью наследования классов

Примечание: Этот учебник адаптирован из главы “Объектно-ориентированное программирование (ООП)” в книге “Основы Python: Практическое введение в Python 3 .

В книге используется встроенный в Python редактор IDLE для создания и редактирования файлов Python и взаимодействия с оболочкой Python, поэтому в этом учебнике вы будете периодически видеть ссылки на IDLE. Однако у вас не должно возникнуть проблем с выполнением кода примеров из редактора и среды по вашему выбору.

Бесплатный бонус: Нажмите здесь, чтобы получить доступ к бесплатной шпаргалке по ООП Python, которая укажет вам на лучшие учебники, видео и книги, чтобы узнать больше об объектно-ориентированном программировании на Python.

Что такое объектно-ориентированное программирование в Python?

Объектно-ориентированное программирование – это парадигма программирования, которая позволяет структурировать программы таким образом, что свойства и поведение объединяются в отдельные объекты.

Например, объект может представлять человека с такими свойствами, как имя, возраст и адрес, и такими поведенческими характеристиками, как ходьба, разговор, дыхание и бег. Или он может представлять электронное письмо с такими свойствами, как список получателей, тема и тело, а также с такими поведениями, как добавление вложений и отправка.

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

Другой распространенной парадигмой программирования является процедурное программирование, которое структурирует программу как рецепт, предоставляя набор шагов в виде функций и блоков кода, которые последовательно выполняются для выполнения задачи.

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

Определение класса в Python

Примитивные структуры данных – числа, строки и списки – предназначены для представления простых фрагментов информации, таких как стоимость яблока, название стихотворения или ваши любимые цвета, соответственно. А что если вам нужно представить что-то более сложное?

Например, предположим, вы хотите отслеживать сотрудников организации. Вам нужно хранить некоторую базовую информацию о каждом сотруднике, такую как его имя, возраст, должность и год начала работы.

Один из способов сделать это – представить каждого сотрудника в виде списка:

У этого подхода есть ряд проблем.

Во-первых, он может усложнить управление большими файлами кода. Если вы ссылаетесь на kirk[0] в нескольких строках от места объявления списка kirk, вспомните ли вы, что элемент с индексом 0 – это имя сотрудника?

Во-вторых, это может привести к ошибкам, если не каждый сотрудник имеет одинаковое количество элементов в списке. В приведенном выше списке mccoy отсутствует возраст, поэтому mccoy[1] вернет “Главный врач” вместо возраста доктора Маккоя.

Отличным способом сделать код такого типа более управляемым и удобным для сопровождения является использование классов.

Классы и экземпляры

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

В этом учебнике вы создадите класс Dog, который будет хранить информацию о характеристиках и поведении отдельных собак.

Класс – это схема того, как что-то должно быть определено. На самом деле он не содержит никаких данных. Класс Dog указывает, что для определения собаки необходимы имя и возраст, но он не содержит ни имени, ни возраста конкретной собаки.

В то время как класс – это чертеж, экземпляр – это объект, созданный на основе класса и содержащий реальные данные. Экземпляр класса Dog – это уже не чертеж. Это реальная собака с именем, например Майлз, которому четыре года.

Говоря иначе, класс – это как форма или анкета. Экземпляр – это как форма, заполненная информацией. Как многие люди могут заполнить одну и ту же форму своей собственной уникальной информацией, так и из одного класса можно создать множество экземпляров.

Как определить класс

Все определения классов начинаются с ключевого слова class, за которым следует имя класса и двоеточие. Любой код, расположенный с отступом ниже определения класса, считается частью тела класса.

Вот пример класса Dog:

Тело класса Dog состоит из единственного оператора: ключевого слова pass. pass часто используется как заполнитель, указывающий, куда в конечном итоге будет помещен код. Это позволяет вам запустить этот код без того, чтобы Python выдал ошибку.

Примечание: По традиции имена классов Python записываются в нотации CapitalizedWords. Например, класс для конкретной породы собак, такой как Джек Рассел Терьер, будет записан как JackRussellTerrier .

Класс Dog сейчас не очень интересен, поэтому давайте немного приукрасим его, определив некоторые свойства, которые все

Вы можете задать .__init__() любое количество параметров, но первым параметром всегда будет переменная self . Когда создается новый экземпляр класса, он автоматически передается параметру self в .__init__(), чтобы можно было определить новые атрибуты объекта.

Давайте обновим класс Dog с помощью метода .__init__(), который создает атрибуты .name и .age:

Обратите внимание, что подпись метода .__init__() отделена четырьмя пробелами. Отступ от тела метода составляет восемь пробелов. Этот отступ жизненно важен. Он сообщает Python, что метод .__init__() принадлежит классу Dog.

В теле метода .__init__() есть два утверждения, использующие переменную self:

self.name = name создает атрибут name и присваивает ему значение параметра name.

  1. self.age = age создает атрибут с именем age и присваивает ему значение параметра age.
  2. Атрибуты, созданные в .__init__(), называются атрибутами экземпляра. Значение атрибута экземпляра специфично для конкретного экземпляра класса. Все объекты Dog имеют имя и возраст, но значения атрибутов имени и возраста будут отличаться в зависимости от экземпляра Dog.

С другой стороны, атрибуты класса – это атрибуты, которые имеют одинаковое значение для всех экземпляров класса. Вы можете определить атрибут класса, присвоив значение имени переменной вне .__init__() .

Например, следующий класс Dog имеет атрибут класса под названием species со значением “Canis familiaris”:

Атрибуты класса определяются непосредственно под первой строкой имени класса с отступом в четыре пробела. Им всегда должно быть присвоено начальное значение. Когда создается экземпляр класса, атрибуты класса автоматически создаются и им присваиваются начальные значения.

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

Теперь, когда у нас есть класс Dog, давайте создадим несколько собак!

Создание объекта в Python

Откройте интерактивное окно IDLE и введите следующий текст:

Это создаст новый класс Dog без атрибутов и методов.

Создание нового объекта из класса называется инстанцированием объекта. Вы можете создать новый объект Dog, набрав имя класса, за которым следуют открывающие и закрывающие круглые скобки:

Теперь у вас есть новый объект Dog по адресу 0x106702d30 . Эта забавно выглядящая строка букв и цифр – адрес памяти, который указывает, где объект Dog хранится в памяти вашего компьютера. Обратите внимание, что адрес, который вы видите на экране, будет другим.

Теперь создайте второй объект Dog:

Новый объект Dog расположен по другому адресу памяти. Это потому, что это совершенно новый экземпляр, полностью уникальный по сравнению с первым объектом Dog, который вы инстанцировали.

Чтобы увидеть это с другой стороны, напечатайте следующее:

В этом коде вы создаете два новых объекта Dog и присваиваете их переменным a и b . Когда вы сравниваете a и b с помощью оператора ==, результатом будет False. Даже тогда, когда

Это создаст два новых экземпляра Dog – один для девятилетней собаки по имени Бадди и один для четырехлетней собаки по имени Майлз.

Метод .__init__() класса Dog имеет три параметра, почему же в примере ему передаются только два аргумента?

Когда вы инстанцируете объект Dog, Python создает новый экземпляр и передает его в первый параметр метода .__init__(). Это, по сути, удаляет параметр self, поэтому вам нужно беспокоиться только о параметрах name и age.

После создания экземпляров собак можно получить доступ к их атрибутам с помощью точечной нотации:

Таким же образом можно получить доступ к атрибутам класса:

Одним из самых больших преимуществ использования классов для организации данных является то, что экземпляры гарантированно имеют атрибуты, которые вы ожидаете. Все экземпляры Dog имеют атрибуты .species, .name, и .age, поэтому вы можете использовать эти атрибуты, зная, что они всегда вернут значение.

Хотя существование атрибутов гарантировано, их значения могут быть изменены динамически:

В этом примере вы изменяете атрибут .age объекта buddy на 10. Затем вы изменяете атрибут .species объекта miles на “Felis silvestris”, который является разновидностью кошки. Это делает Майлза довольно странной собакой, но это правильный Python!

Ключевым моментом здесь является то, что пользовательские объекты по умолчанию являются изменяемыми. Объект является изменяемым, если он может быть изменен динамически. Например, списки и словари являются изменяемыми, а строки и кортежи – неизменяемыми.

Методы экземпляра

Методы экземпляра – это функции, которые определяются внутри класса и могут быть вызваны только из экземпляра этого класса. Как и в случае с .__init__(), первым параметром метода экземпляра всегда является self.

Откройте новое окно редактора в IDLE и введите следующий класс Dog:

У этого класса Dog есть два метода экземпляра:

.description() возвращает строку, отображающую имя и возраст собаки.

.speak() имеет один параметр под названием sound и возвращает строку, содержащую имя собаки и звук, который она издает.

Сохраните модифицированный класс Dog в файл с именем dog.py и нажмите F5, чтобы запустить программу. Затем откройте интерактивное окно и введите следующий текст, чтобы увидеть методы экземпляра в действии:

В приведенном выше классе Dog функция .description() возвращает строку, содержащую информацию об экземпляре Dog miles . При написании собственных классов неплохо иметь метод, который возвращает строку, содержащую полезную информацию об экземпляре класса. Однако .description() – не самый питонический способ сделать это.

Когда вы создаете объект list, вы можете использовать print() для вывода строки, похожей на список:

  1. Давайте посмотрим, что произойдет, если вы выведете print() объект miles:
  2. Когда вы выводите print(miles), вы получаете загадочное сообщение о том, что miles – это объект Dog по адресу памяти 0x00aeff70. Это сообщение не очень полезно. Вы можете изменить то, что будет напечатано, определив специальный метод экземпляра под названием .__str__() .

В окне редактора измените имя метода .description() класса Dog на .__str__() :

Сохраните файл и нажмите F5 . Теперь, когда вы выводите print(miles), вы получаете гораздо более дружественный вывод:

Такие методы, как .__init__() и .__str__(), называются методами Дандера, потому что они начинаются и заканчиваются двойным подчеркиванием. Существует множество методов dunder, которые можно использовать для настройки классов в Python. Хотя это слишком сложная тема для книги по Python для начинающих, понимание методов dunder является важной частью освоения объектно-ориентированного программирования на Python.

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *