Об'єктно-орієнтоване програмування
Цикли, розгалуження і функції — все це елементи процедурного програмування. Його можливостей цілком достатньо для написання невеликих, простих програм. Однак великі проекти часто реалізують, використовуючи парадигму об'єктно-орієнтованого програмування (ООП).
Слід зауважити, не усі сучасні мови підтримують ООП. Але в Python ООП грає ключову роль. Навіть програмуючи в рамках структурної парадигми, ви усе одно користуєтесь об'єктами і класами, нехай навіть вбудованими в мову, а не створенними особисто вами.
Отже, що ж таке об'єктно-орієнтоване програмування? Судячи з назви, ключову роль тут відіграють якісь об'єкти, на які орієнтується весь процес програмування.
Якщо подивитись на реальний світ під тим кутом, під яким звикли на нього дивитись, то для нас він предстане у вигляді багатьох об'єктів, яким притаманні певні властивості, які взаємодіють між собою и внаслідок цього змінюються. Ця звична для погляду людини картина світу була перенесена у програмування. Вона вимагала більш високого рівня абстракції від того, як обчислювальна машина зберігає і обробляє дані, вимагала від програмістів вміння конструювати свого роду "віртуальі світи", розподілювати між собою задачі. Однак дала можливість більш легкої і продуктивної розробки великих програм.
Припустимо, команда програмістів займається розробкою гри. Програму-гру можна представити якк систему, яка складається з цифрових героїв і середовища їх існування, яке включає багато предметів. Кожен воїн, зброя, дерево, будинок — це цифровий об'єкт, в якому "упаковано" його властивості і дії, за допомогою яких він може змінювати свої властивості і властивості інших об'єктів.
Кожен програміст може розробляти свою групу об'єктів. Розробникам достатньо домовитись між собою тільки про те, якк об'єкти будуть взаємодіяти між собою.
Ключову різницю між програмою, написаною в структурному стилі, і об'єктно-орієнтованою програмою можна висловити так: у першому випадку на перший план виходить логіка, розуміння послідовності виконання дій для досягнення поставленої цілі. У другому — важливіше представити програму як систему об'єктів, які взаємодіють.
Поняття ООП
Об'є́ктно-орієнто́ване програмува́ння (ООП) — одна з парадигм програмування, яка розглядає програму як множину «об'єктів», що взаємодіють між собою.
Основу ООП складають наступні принципи:
- інкапсуляція
- успадкування
- поліморфізм
- абстракція
Основними поняттями в ООП є класс та об'єкт.
Що таке клас? Проведемо аналогію з реальним світом. Якщо ми візьмем конкретний стіл, то це об'єкт, але не клас. А ось загальне уявлення про столи, їх призначення — це клас. Йому належать усі реальні об'єкти столів, якими б вони не були. Клас столів дає загальну характеристику усім столам в світі, він їх узагальнює.
Те ж саме з цілими числами в Python.
Тип int
— це клас цілих чисел.
Числа 5, 100500, -10 і т. д. — це конкретні об'єкти цього класа.
Наступне по важливості поняття ООП — успадкування. Повернемось до столів. Нехай є клас столів, який описує загальні властивості усіх столів. Однак можна розділити усі столи на письмові, обіді і журнальні і для кожної групи створити свій клас, який буде спадкоємцем загального класа, але також вносити ряд своїх особливостей. Таким чином, загальний клас будет батьківським, а класи груп — дочірніми.
Дочірні класи успадковують особливості батьківських, однак доповнюють або у деякій мірі модифікують їх характеристики. Коли ми створюємо конкретний екземпляр стола, то повинні обрати, до якого класу столів він буде належати. Якщо він належить класу журнальних столів, то отримає усі характеристики загального класа столів і класа журнальних столів. Але не особливості письмових і обідніх.
Інкапсуляцію в ООП розуміють двояко. У багатьох мовах цей термін означає приховування даних, тобто неможливість напряму отримати доступ до внутрішньої структури об'єкта, так як це небезпечно. В Python немає такої інкапсуляції, хоча вона є одним з стандартів ООП. В Python можна отримати доступ до будь-якої властивості об'єкта і змінити його. Однак є механізм, який дозволяє імітувати приховування даних, якщо це так необхідно.
Інший смисл інкапсуляції — об'єднання властивостей і поведінки в одне ціле, тобто в клас.
Поліморфізм — це множина форм. Однак в поняттях ООП мається на увазі скоріш зворотнє. Об'єкти різних класів, з різною внутрішньою реалізацією можуть мати однакові інтерфейси. Наприклад, для чисел є операція додавання, яка позначається знаком +. Однак ми можемо визначити клас, об'єкти котрого також будуть підтримувати операцію, яка позначається цим знаком. Але це зовсім не означає, щоо об'єкти повинні бути числами, і буде отримуватись якась сума. Операція + для об'єктів нашого класа може означати щось інше. Але інтерфейс, в даному випадку це знак +, у чисел і нашего класа буде однаковим. Поліморфність же проявляється у внутрішній реалізації і результаті операції.
Ми вже стикались з поліморфізмом операції +. Для чисел вона означає додавання, а для рядків — конкатенацію. Внутрішня реалізація кода для цієї операції у чисел відрізняється від реалізації такої для рядків.
ООП в Python
В термінології Python об'єкти також прийнято називати екземплярами (instance) певного класа.
В Python усе є об'єкт!
Навіть класи — це теж об'єкти, екземпляри метакласів.
Головним метакласом є клас type
,
який і є абстракцією поняття типа даних.
Отже в Python клас рівносильний поняттю тип даних.