Основний дефект процедурного стилю програмування полягає в тому, що він слабко пристосований для розроблення великих програм. Із часом програми стають настільки складними, що розібратися в них непросто. Одним із напрямків розв’язування цієї проблеми є об’єктно-орієнтоване програмування (ООП).
Елементи теорії об’єктно-орієнтованого програмування. ООП базується на трьох основних принципах: • наслідування; • поліморфізм; • інкапсуляція. Ці принципи є досить абстрактними та складними для розуміння на початкових етапах ознайомлення з мовою. В ООП загалом використовується значна кількість нових термінів. Щоб свідомо опанувати їх, розглядатимемо їх поступово на прикладах.
Елементи теорії об’єктно-орієнтованого програмування. Чим жираф схожий на тротуар? Тим, що і жираф, і тротуар - сутності, які в розмовній мові є іменниками, а в мові Python - об'єктами. Концепція об'єктів має важливе значення в світі програмування. Об'єкти - це спосіб організації коду в програмі, а також спосіб поділу складних завдань на більш прості, що полегшує їх розв’язання.
Елементи теорії об’єктно-орієнтованого програмування. Щоб як слід розібратися, що таке об'єкти в Python, потрібно поговорити про їх типи. Почнемо з жирафів і тротуарів. Жираф - це тип (або вид, як кажуть біологи) ссавців, а ссавці, в свою чергу, є одним з типів тварин. Крім того, жираф - одухотворений об'єкт, оскільки він живий. Головне, що можна сказати про тротуар, - він неживий, а значить, відноситься до неживих об'єктів. Поняття «ссавець», «тварина», «одухотворений» і «неживий» - це способи класифікації сутностей
Елементи теорії об’єктно-орієнтованого програмування. До основних понять об’єктно-орієнтованого програмування належать об’єкт, клас, метод. Клас (Class) — об’єкт, що складається із сукупності методів і змінних (атрибутів), які описують цей об’єкт. Метод (Method) — сукупність інструкцій мови опрацювання даних.
Елементи теорії об’єктно-орієнтованого програмування. Змінна екземпляра класу (Instance variable) — змінна, що визначена всередині методу класу і яка належить тільки цьому класу. Екземпляр класу (Instance) — окремий об’єкт класу. Змінна класу (Class variable) — звичайна змінна, що визначається всередині класу (а не всередині методів класу), яка є доступною для всіх екземплярів цього класу.
Елементи теорії об’єктно-орієнтованого програмування. Мова ООП має відповідати таким вимогам: • усі дані подаються об’єктами; • програма є набором об’єктів, які взаємодіють між собою та надсилають один одному необхідні повідомлення; • кожен об’єкт може мати у своєму складі інші об’єкти, і для всіх них виділяється власна частина пам’яті; • кожен об’єкт належить одному типу (класу), який задає поведінку об’єктів, створених на їх основі; • об’єкти одного типу можуть виконувати одні й ті са - мі дії.
Елементи теорії об’єктно-орієнтованого програмування. Мова Python є гібридною, оскільки поєднує властивості як процедурного, так і об’єктно-орієнтованого програмування. Така особливість мови Python дала змогу на початкових етапах її вивчення основну увагу приділити синтаксичним конструкціям, функціям і модулям, без яких не може існувати не лише процедурне, а й об’єктно-орієнтоване програмування. Розуміння цих питань допоможе тепер якісно оволодіти й методами ООП.
1) основною складовою мови ООП є клас, головне призначення якого — створення та маніпулювання об’єктами, а також підтримка механізму наслідування як способу адаптації програмного коду для розв’язування однотипних задач і неодноразового його використання; 2)об’єкти мови Python нагадують убудовані типи, які було описано раніше; 3) програма складається з окремих, достатньо незалежних частин, що суттєво полегшує її розуміння й читання; 4) нова програма може розроблятися не «з нуля», а шляхом адаптування вже наявного програмного коду, без його зміни. Характерними особливостями ООП мовою Python є:
Під час кожного звернення до класу створюється новий об’єкт — екземпляр класу, тому можна отримати необмежену кількість екземплярів на основі цього класу. Отже, основою ООП є клас — це складний тип даних із певним набором змінних (атрибутів) і функцій (методів) опрацювання значень, що зберігаються в цих змінних. Елементи теорії об’єктно-орієнтованого програмування
Об’єкти в програмі можна створювати лише на основі класів, тому програма починається зі створення класу. Класи можна розробляти самостійно або імпортувати з інших модулів. Вони розміщуються на початку програмного коду. Створення класів і об’єктів. Якщо програма містить класи, то створюється дерево пов’язаних об’єктів. У такому разі реалізується вираз <об’єкт>.<атрибут>. Інтерпретатор починає пошук зазначеного атрибута в дереві пов’язаних об’єктів у такому порядку: спочатку атрибут відшукується в цьому самому об’єкті, потім — у дереві об’єктів знизу догори і зліва направо. Пошук завершується, щойно буде знайдено першу появу атрибута.
Класи створюються за допомогою інструкції class і мають таку загальну структуру: class <ім’я класу> [(класи, що є нащадками)]: <тіло класу>Створення класів і об’єктів. Тіло класу містить змінні та функції класу. Функції в ООП називають методами, а змінні класу — атрибутами. Атрибути створюються як звичайні змінні, а методи — як звичайні функції за допомогою інструкції def. Методи можна розглядати як невеликі програми, призначені для опрацювання об’єктів, тобто вони створюють нові властивості об’єктів, змінюють наявні тощо. Методи фактично є аналогами підпрограм у мовах процедурного програмування.
Щоб визначити, який саме екземпляр класу слід опрацьовувати, у методі обов’язково слід указати перший параметр з іменем self (інші параметри можуть бути відсутні). Цьому параметру автоматично передається посилання на відповідний екземпляр класу. За допомогою параметру self здійснюється доступ до змінних екземпляра класу та методів класу всередині визначеного методу. Параметр self відокремлюється від змінної або методу крапкою. Створення класів і об’єктів
Необхідно чітко розуміти, що в результаті виконання інструкції class буде створено новий екземпляр класу, який також є об’єктом, посилання на який присвоюється імені змінної. Якщо цей клас має батьківські класи (суперкласи), від якого він є нащадком, то вони вказуються в круглих дужках через кому. Якщо він не є нащадком, то круглі дужки не вказуються. Створення класів і об’єктів Для того щоб можна було використовувати атрибути та методи класу, необхідно створити екземпляр класу за такою структурою: <екземпляр класу> = <ім’я класу> ([параметри])
Тут <екземпляр класу> є звичайним ідентифікатором. У результаті кожного виконання цієї інструкції у пам’яті комп’ютера виділяється ділянка пам’яті, доступ до якої здійснюється за допомогою пов’язаного з ним ідентифікатора, тобто в пам’яті створюється об’єкт. Цей об’єкт має характеристики того класу, у якому його створено, тобто він отримує атрибути свого класу. Створення класів і об’єктів Метод викликається з основного блоку програми за допомогою інструкції: <екземпляр класу>.<ім’я методу> ([параметри])
Створимо клас сутностей: class Things: pass. Ми дали класу ім'я Things і використовували конструкцію pass, що позначає, що більше ніякої інформації ми вказувати не будемо. Pass - команда, за допомогою якої можна створювати класи або функції, не програмуючи спочатку їх поведінку. Створення класів і об’єктів Метод викликається з основного блоку програми за допомогою інструкції: <екземпляр класу>.<ім’я методу> ([параметри])
Коли один клас є окремим випадком (підкласом) іншого класу, кажуть, що перший клас - нащадок, а другий - предок. Один і той же клас може бути як нащадком деяких класів, так і предком для інших класів. На нашій діаграмі клас, що знаходиться прямо над іншим класом, - його предок, а клас під іншим класом - його нащадок. Створення класів і об’єктів
Наприклад, класи Inanimate і Animate - нащадки класу Things, який є їхнім предком. Для позначення того, що створюваний клас є нащадком іншого класу, потрібно вказати ім'я класу-предка в дужках після імені нового класу. Створення класів і об’єктівclass Inanimate(Things): pass class Animate(Things): pass
Тепер, коли у нас є набір класів, пора створити належні їм сутності. Припустимо, у нас є жираф на ім'я Реджинальд. Ми знаємо, що він відноситься до класу Giraffes. Як саме описати в програмі конкретного жирафа, якого звуть Реджинальд? Будемо вважати Реджинальда (reginald) об'єктом класу Giraffes. Щоб «познайомити» Python з нашим Реджинальдом, потрібно написати наступний код: Створення класів і об’єктів reginald = Giraffes()
Кожному з створених класів можна задати характеристики. Характеристики - це особливості, властиві всім об'єктам даного класу, а також об'єктів класів-нащадків. Наприклад, що спільного у всіх тварин? Вони дихають, рухаються і їдять. А у ссавців? Вони вигодовують своїх дитинчат молоком, а також дихають, рухаються і їдять. Жирафи, як відомо, об'їдають листя з верхівок дерев і, як інші ссавці, годують дитинчат молоком, дихають, рухаються і їдять. Якщо додати ці характеристики до нашої діаграми, вийде ось що: Створення класів і об’єктів
Для додавання функцій класу ми використовуємо ключове слово def, тому клас Animals буде виглядати приблизно так: Створення класів і об’єктів class Animals(Animate): def breathe(self): pass def move(self): pass def eat_food(self): pass. Аргумент self дає функції класу можливість викликати інші функції цього класу (а також класів предків)
Оскільки reginald є об'єктом, ми можемо викликати функції, визначені в його класі (Giraffes) і в його класах-предків. Щоб викликати таку функцію для об'єкта, потрібно після імені об'єкта ввести крапку, а потім ім'я функції. Відповідно, можна датикоманду рухатися або їсти, викликаючи функції таким чином: Створення класів і об’єктівreginald = Giraffes() reginald.move() reginald.eat_leaves_from_trees()