Всіх вітаю! У цьому матеріалі ми розберемо суть вбудованих функцій isinstance() та issubclass() та як ними користуватися у коді. Також розглянемо одну з концепцій ООП — наслідування та як воно працює.
Функція isinstance()
Функція isinstance() перевіряє приналежність об’єкту до якогось об’єкту класу. Вона приймає два параметри: об’єкт та об’єкт класу, належність до якого ми хочемо перевірити.
Ось приклад у коді:
test_list = [1, 2, 3, 4, 5]
print(isinstance(test_list, list))У цьому прикладі ми створили список test_list та перевіряли його приналежність до класу list у Python. У результаті отримуємо:
TrueОтримали True. Це означає, що список test_list належить до класу list, тобто список test_list є саме списком і нічим іншим.
Ось ще один приклад використання isinstance():
test_tuple = (1, 2, 3, 4, 5)
print(isinstance(test_tuple, int))FalseТут ми отримали False, бо ми хотіли перевірити кортеж test_tuple на приналежність до класу int. У підсумку кортеж test_tuple не є цілим числом.
Розглянемо останній приклад, де перевіримо, чи належить словник об’єкту класу dict:
numbers_dict = {
"One": 1,
"Two": 2,
"Three": 3
}
print(isinstance(numbers_dict, dict))TrueЯк бачимо, словник numbers_list є словником.
Концепція наслідування у класах
Перед тим як почати вивчення нової функції, я думаю, що треба дещо ознайомитися із концепцію наслідування у Python.
Отже, наслідування — це така концепція у ООП (Об’єктно-орієнтованому програмуванні), яка передбачає, що один клас може наслідувати атрибути або методи іншого класу. Клас, з якого ми наслідуємо називають батьківським класом, а той клас, який наслідує називається дочірнім.
Вважаю, що краще розібрати це на прикладі:
class Main:
def __init__(self, message):
self.message = message
def show_message(self):
print(self.message)
class Sub (Main):
def __init__(self, message):
super().__init__(message)
def print_text(self):
print("Message here:")
super().show_message()
test = Sub("Hi! You're run the code!")
test.print_text()Message here:
Hi! You're run the code!Це готовий приклад наслідування і у ньому Main — це батьківський клас, бо саме з нього ми наслідуємо атрибут та метод, а Sub — дочірній, бо якраз-таки він наслідує атрибут message та метод show_message(). Думаю краще розбити даний код на частини і дослідити окремо.
Спочатку ми створюємо клас Main, де створюємо атрибут message та метод show_message():
class Main:
def __init__(self, message):
self.message = message
def show_message(self):
print(self.message)Далі створюємо клас Sub, який буде наслідувати атрибут message та метод show_message():
class Sub (Main):
def __init__(self, message):
super().__init__(message)
def print_text(self):
print("Message here:")
super().show_message()Біля класу Sub ми записуємо у дужках клас Main, тобто ми якби кажемо, що клас Sub наслідує від класу Main. Таким чином клас Sub є підкласом Main:
class Sub (Main):У цьому класі ми застосовуємо функцію super(), яка і дозволяє нам отримувати атрибут message та метод show_message().
Ось у цьому рядку ми отримуємо доступ до атрибуту message з класу Main:
super().__init__(message)А у цьому отримуємо доступ до методу show_message() з класу Main:
super().show_message()Тобто у цьому прикладі ми передали за допомогою функції super() атрибут та метод до класу Sub. Щоб позначити, що клас Sub наслідує клас Main треба записати біля Sub у дужках назву класу, від якого ми наслідуємо атрибути/методи.
Наприкінці ми створюємо об’єкт test та викликаємо метод print_text():
test = Sub("Hi! You're run the code!")
test.print_text()Зверніть увагу, що ми взагалі не чіпаємо батьківський клас Main, тільки дочірній клас Sub.
Функція issubclass()
Функція issubclass() перевіряє, чи є один клас підкласом іншого. Вона приймає два класи — один ми вважаємо підкласом (дочірнім), а інший ми вважаємо батьківським. Ось приклад, де ми перевіряємо клас Sub() на те, чи є він підкласом класу Main().
class Main:
def __int__(self):
pass
class Sub (Main):
def __int__(self):
pass
print(issubclass(Sub, Main))TrueТут ми отримали True, так як у коді ми вказали у дужках, що клас Sub є дочірнім класом батьківського класу Main. Тому Sub однозначно є підкласом Main.
Тепер розглянемо протилежний приклад, коли Sub не є підкласом Main:
class Main:
def __int__(self):
pass
class Sub:
def __int__(self):
pass
print(issubclass(Sub, Main))FalseУ цьому випадку Sub вже не є підкласом Main, бо ми не вказали у дужках класу Sub, що він є підкласом Main.
Останнє, що ми розглянемо стосовно функції issubclass() — це її особливість, що клас є підкласом самого себе. Ось приклад такої особливості:
class Main:
def __int__(self):
pass
print(issubclass(Main, Main))TrueОсь і отримали True, тобто клас Main є розглядається як підклас самого себе.
Висновок
У цій статті ми познайомилися з двома вбудованими функціями — isinstance() та issubclass(). Крім суті цих функцій, ми також зрозуміли як використовувати їх у коді. Сподіваюся даний матеріал був корисним та зміг пояснити вам концепцію наслідування та їх зв’язок із функцією issubclass().