Усі приклади у цьому пункті написані з використанням української мови для кращого усвідомлення матеріалу. Проте на практиці так робити не можна! Усі ідентифікатори створюються тільки за допомогою латинського алфавіту та англійською мовою!
Однією з парадигм, яку підтримує мова Python, є об'єктно-орієнтоване програмування (ООП). Його основними поняттями є клас та об'єкт.
Розглянемо два об'єкта – кошеня та стіл. Спробуємо класифікувати ці об'єкти у вигляді схеми.
У мові Python кожен об'єкт визначається класами. Схема, зображена вище, складається з класів. Основний клас (його ще називають батьківським класом) – це Предмети. Класи Живі, Тварини, Кошеня називають нащадками класу Предмети. У мові Python списки, кортежі, словники тощо теж є класами.
Отже, клас (Class) – це шаблон для створення об'єкту, користувацький тип, який описує устрій об'єктів, які йому належать. Об'єкт класу називають екземпляром класу (Instance).
Для створення класу використовується інструкція class. Найпростіший клас має такий вигляд:
class My_class:
pass
Цей клас складається з оголошення (class), імені класу (конкретно у нашому випадку My_class; по домовленості ім'я класу пишуть з великої літери, хоч це і не обов'язково) та тіла класу (у нашому випадку це оператор pass, який використовується, коли ми визначаємо клас, але не заповнюємо ніякі деталі). Тіло класу містить змінні (атрибути; поля), які описують його параметри, та функції (методи) – закінчені послідовності дій, спрямованих на вирішення певного завдання.
Загальний вигляд будь-якого класу такий:
class <ім'я_класу>[(батьківський_клас)]:
<тіло класу>
Якщо повернутись до нашого прикладу, то створення класу Живі, який є нащадком класу Предмети, матиме такий вигляд:
class Живі(Предмети):
pass
Аналогічно створюють й інші класи. Зокрема, клас Кошеня створюємо так:
class Кошеня(Тварини):
pass
Клас Тварини може мати такі атрибути, як кількість кінцівок, шкірний покрив тощо:
class Тварини(Живі):
кількість_кінцівок = 4
шкірний_покрив = 'шерсть'
Додамо об'єкт Мурчик до класу Кошеня. Для цього скористаємось таким кодом:
Мурчик = Кошеня()
Загальний вигляд команди створення екземпляра класу:
ім’я_об’єкта = ім’я_класу()
Тепер визначимося з діями, які можуть виконувати об'єкти класів. Наприклад, нехай дії екземплярів класу Тварини – дихати, рухатись, харчуватись; класу Кошеня – пити молоко. Дії, які можуть виконувати об'єкти класів називають функціями або методами класу; їх створюють як звичайну функцію за допомогою інструкції def.
class Тварини(Живі):
def дихати(self):
pass
def рухатись(self):
pass
def харчуватись(self):
pass
class Кошеня(Тварини):
def пити_молоко(self):
pass
Створені функції містять обов’язковий параметр self. За його допомогою одна функція у класі може звернутись до інших функцій у цьому класі (і у батьківських класах). Тепер для об’єкту Мурчик можна викликати функції, властиві його класові та його батьківським класам. Під час виклику функції застосовуємо оператор крапку (.):
Мурчик.рухатись()
Мурчик.пити_молоко()
Отже, метод викликається за допомогою команди:
ім’я_об’єкта.ім’я_методу([параметри])
Зверніть увагу, що екземпляр класу-нащадку може викликати метод як зі свого класу, так і з батьківських класів, тобто методи унаслідуються нащадками.
Виклик функцій може відбуватися іншими функціями в класі. Для цього використовують параметр self. Створимо нову функцію для класу Кошеня і здійснимо у ній виклик іншої функції:
class Кошеня(Тварини):
def пити_молоко(self):
print('П\'ю молочко!')
def обідати(self):
self.рухатись()
print('Я на кухні!')
self.пити_молоко()
У результаті виклику функції обідати отримуємо на екрані таке:
Я на кухні!
П'ю молочко!
Таким чином, відбувся виклик функції пити_молоко всередині функції обідати.
Розглянемо приклад, у якому, окрім параметра self, використовується інший параметр.
class Тварини(Живі):
кількість_кінцівок = 4 # атрибут класу
шкірний_покрив = 'шерсть' # атрибут класу
def кінцівки(self, n): # метод класу з двома параметрами!
self.кількість_кінцівок = n
def покрив(self, p): # метод класу з двома параметрами!
self.шкірний_покрив = p
Собака = Тварини() # додавання екземпляра класу
Павук = Тварини() # додавання екземпляра класу
# виведення значень атрибутів "кількість_кінцівок" та "шкірний_покрив" екземпляра Собака
print('У собаки є', Собака.кількість_кінцівок, 'кінцівки та', Собака.шкірний_покрив)
# звернення до методу "кінцівки" екземпляра Павук з параметром 10
Павук.кінцівки(10)
# виведення значення атрибута "кількість_кінцівок" після його зміни у методі "кінцівки"
print('У павука', Павук.кількість_кінцівок, 'лапок')
У мові Python існує спеціальний вид функцій, який дозволяє задати властивості (атрибути) об'єкта під час його створення. Він має назву конструктор класу і представлений методом __init__ (з обидвох боків по два знаки підкреслення). Коли створюється новий об'єкт класу, то ця функція автоматично викликається. Наприклад, ми хочемо під час створення об'єкта Кошеня вказувати його колір:
class Кошеня:
def __init__(self, колір): # створення конструктора, який визначає атрибут 'колір'
self.колір = колір
Мурчик = Кошеня('сірий') # створення об'єкта 'Мурчик' із заданим значенням властивості 'колір'
print(Мурчик.колір)
Результат: сірий
Метод __init__ викликається щоразу під час створення нового екземпляра класу (об'єкта). Екземпляр класу передається як аргумент параметру self як аргумент, а значення аргументів – параметрам методу.
Також у методі __init__ можна вказати властивість по замовчуванню і не визначати її при створенні об'єкта:
class Кошеня:
def __init__(self, колір = 'рудий'):
self.колір = колір
Мурчик = Кошеня()
print(Мурчик.колір)
Результат: рудий