Programming Concepts Course
  • Економіка & Великі дані
  • Математика
  • Бізнес Економіка
  1. Вступ до ООП
  2. Practice Session 14
  • 👋🏻 Вітаємо на курсі!
  • Змінні, типи даних. Математичні операції в Python
    • Practice Session 2
  • Списки
    • Practice Session 6
  • Функції
    • Practice Session 8
  • Основи Git
    • Practice Session 9
  • Словники. List Comprehension
    • Practice Session 10
  • Базова робота з файлами. Обробка помилок
    • Practice Session 12
  • Обробка даних з JSON та CSV
    • Practice Session 13
  • Вступ до ООП
    • Practice Session 14
  • Базова робота з бібліотеками
    • Practice Session 15
    • Practice Session 16

Зміст

  • Вступ до Об’єктно-орієнтованого програмування на Python
  • 📌 План заняття:
  • 📝 Cheat Sheet
  • 🏁 На старт, ініт, руш!
    • 👨‍💻 Live coding 1: Пилососи та мікрихвильовки
    • 🛠 Guided Practice
  • Класи, що містять класи, що містять класи… (композиція)
    • 👨‍💻 Live Coding 2: Пилососи, мікрихвильовки та як вони пов’язані
    • 🛠 Guided Practice
  • ↔︎️ Цей чудовий світ наслідування
    • 👨‍💻 Live Coding 3: Передові технології
    • 🛠 Guided Practice
  1. Вступ до ООП
  2. Practice Session 14

Practice Session 14

Вступ до Об’єктно-орієнтованого програмування на Python

Об’єктно-орієнтоване програмування (ООП) — це парадигма програмування, де програма будується як сукупність об’єктів, що взаємодіють між собою. Кожен об’єкт — це екземпляр класу, що об’єднує дані (атрибути) та поведінку (методи) в єдину структуру.

На сьогоднішньому занятті ми розглянемо основи ООП на мові програмування Python та побачимо як ця парадигма допомагає в розробці в реальному житті.

📌 План заняття:

  • 🏁 На старт, ініт, руш!
    • 👨‍💻 Live coding 1: Пилососи та мікрихвильовки
    • 🛠 Guided Practice
  • Класи, що містять класи, що містять класи… (композиція)
    • 👨‍💻 Live Coding 2: Пилососи, мікрихвильовки та як вони пов’язані
    • 🛠 Guided Practice
  • ↔︎️ Цей чудовий світ наслідування
    • 👨‍💻 Live Coding 3: Передові технології
    • 🛠 Guided Practice

📝 Cheat Sheet

🧱 1. Класи та Об’єкти

  • Клас (Class) — це шаблон, креслення або інструкція. Він описує, які характеристики та дії матиме майбутня сутність.
  • Об’єкт (Instance / Екземпляр) — це конкретна річ, створена за цим шаблоном.
# Створення порожнього класу
class Toaster:
    pass

# Створення об'єктів (екземплярів) класу
my_toaster = Toaster()
mom_toaster = Toaster() 

🧬 2. Конструктор __init__ та self

  • __init__ (ініціалізатор) — це спеціальний метод (функція), який автоматично викликається при створенні нового об’єкта. Він задає початковий стан (характеристики).
  • self — це посилання об’єкта на самого себе. Завдяки self Python розуміє, що ми хочемо змінити колір конкретно цього тостера, а не всіх тостерів у світі. self завжди є першим параметром у методах класу.

⚙️ 3. Атрибути та Методи

  • Атрибути (Властивості) — це змінні, що належать об’єкту .
  • Методи — це функції, що належать об’єкту.
class Toaster:
    def __init__(self, brand, slots):
        # Атрибути (дані)
        self.brand = brand
        self.slots = slots
        self.is_on = False
    
    # Метод (дія)
    def turn_on(self):
        self.is_on = True
        print(f"Тостер {self.brand} увімкнено!")

# Використання:
t1 = Toaster("Philips", 2)
print(t1.brand)  # Виведе: Philips
t1.turn_on()     # Виведе: Тостер Philips увімкнено!

🤝 4. Композиція (Взаємодія об’єктів)

Об’єкти можуть містити інші об’єкти. Наприклад, об’єкт “Кухня” може мати всередині себе список з об’єктів “Тостер”, “Мікрохвильовка” тощо. Це дозволяє будувати складні системи з простих блоків.

class Kitchen:
    def __init__(self):
        self.devices = [] # Список для зберігання ІНШИХ об'єктів
        
    def add_device(self, device_object):
        self.devices.append(device_object)
        
# Використання:
my_kitchen = Kitchen()
my_kitchen.add_device(t1) # Додаємо об'єкт t1 (з попереднього прикладу) у список

🧬 5. Наслідування (Inheritance)

Дозволяє створити новий клас на основі існуючого. Новий клас (Дочірній) отримує всі атрибути та методи старого (Батьківського), але може додавати свої. Це принцип DRY (Don’t Repeat Yourself) у дії. * Використовуємо super().__init__(), щоб викликати конструктор батьківського класу і не писати код наново.

# Батьківський клас - Toaster
class SmartToaster(Toaster): # Вказуємо в дужках, від кого наслідуємо
    def __init__(self, brand, slots, has_wifi):
        # Викликаємо ініт батька (передаємо brand та slots)
        super().__init__(brand, slots) 
        # Додаємо унікальний атрибут для розумного тостера
        self.has_wifi = has_wifi 

🎭 6. Поліморфізм (Перевизначення методів)

Дочірній клас може не лише використовувати батьківські методи, але й змінювати їхню поведінку. Якщо ми створимо в дочірньому класі метод з такою ж назвою, як у батьківському, він “перекриє” старий.

class SmartToaster(Toaster):
    # ... (тут __init__ з попереднього прикладу) ...

    # Перевизначаємо метод turn_on
    def turn_on(self):
        if self.has_wifi:
            print(f"[{self.brand}] Підключення до Wi-Fi... Увімкнено через додаток!")
        else:
            # Можна викликати стару логіку батька:
            super().turn_on() 

🏁 На старт, ініт, руш!

Перед тим, як будувати складні системи, треба навчитися створювати базові “цеглинки”. У цьому розділі ми напишемо наші перші класи. Ми навчимо їх запам’ятовувати свій стан та виконувати специфічні дії. Оскільки ми працюємо над симулятором кухні, почнемо зі створення найнеобхіднішої побутової техніки.

Для виконання цієї задачі, нам знадобиться створити клас та виконати його ініціалізацію - це те, що дозволить нам створювати об’єкти з певними характеристиками.

👨‍💻 Live coding 1: Пилососи та мікрихвильовки

Контекст: Ми працюємо над створенням відеогри - симулятор кухні. Для того, аби цю гру розробити, ми маємо додати в неї різноманітні об’єкти, з якими можна буде взаємодіяти. На даному етапі очевидним є той факт, що будь яка притома кухня має мати мікрохвильовку! Тому з її створення ми і почнемо.

Вхідні дані:

  • Клас Microwave.
  • Атрибути: brand, power.
  • Метод: heat(food, seconds), який приймає назву їжі та час.
  • Метод ping(), який імітує звук завершення.

Очікуваний результат: Створено мікрохвильовку. Викликано метод heat(), який виводить результат розігріву.

🛠 Guided Practice

Контекст: Ми продовжуємо розробляти нашу кухню. Будь яку кухню потрібно прибирати, а для цього нам потрібен робот-пилосос. Створіть клас RobotVacuum з відповідними атрибутами та методами, які дозволять йому виконувати свою роботу.

Вхідні дані:

  • Клас RobotVacuum.
  • Атрибути: name, battery_level, power.
  • Метод: clean(), який зменшує батарею на 20% і виводить повідомлення про прибирання. Якщо батарея менше 20%, просить зарядки.
  • Метод: get_stuck(), який повертає рядок: “Пилосос [Ім’я] застряг під диваном і жалібно пищить.”

Очікуваний результат: Створено об’єкт робота-пилососа. Викликано clean() кілька разів, поки не сяде батарея. Симульовано застрягання через get_stuck().

Класи, що містять класи, що містять класи… (композиція)

Об’єкти в реальному житті рідко існують у вакуумі. Як мікрохвильовка та робот-пилосос не можуть просто висіти в повітрі, так і в коді об’єкти повинні взаємодіяти. Концепт, коли один об’єкт є частиною іншого (або містить інші об’єкти), називається композицією. На цьому етапі нам доведеться створити класи-контейнери, які будуть керувати іншими нашими об’єктами.

👨‍💻 Live Coding 2: Пилососи, мікрихвильовки та як вони пов’язані

Контекст: Робота над створенням кухні продовжується. Ми вже маємо мікрохвильовку та робот-пилосос, але що ж вони представляють по окремості? Де їм працювати? Вони ж не можуть просто так стояти посеред кухні! Для цього нам,власне потрібна сама кухня, яка буде містити в собі ці об’єкти. Створіть клас Kitchen, який буде містити в список із приладів, які на ній є.

Вхідні дані:

  • Клас Kitchen.
  • Атрибути: сипсок appliances.
  • Метод: add_appliance(appliance), який додає прилад на кухню.
  • Метод: get_total_power(), який рахує сумарну потужність усіх приладів.

Очікуваний результат: Створено Kitchen. Додано мікрохвильовку та робота пилососа. Метод коректно рахує загальну потужність, щоб знати, чи виб’є пробки.

🛠 Guided Practice

Контекст: Коли ми додали пилосос до нашої кухні, ми не врахували одну річ: що станеться якщо пилосос розрядиться? Для того аби наша кухня не лишилася в неаздовільному стані, нам потрібно створити станцію для зарядки пилососа. Створіть клас ChargingHub, який і буде відповідати за зарядку наших роботів-пилососів.

Вхідні дані:

  • Клас ChargingHub.
  • Атрибути: hub_id, docked_vacuums (порожній список).
  • Метод: dock_vacuum(vacuum), який приймає об’єкт RobotVacuum і додає його до списку «припаркованих».
  • Метод: charge_all(), який проходить циклом по всіх пилососах у списку і встановлює їхній battery_level на 100. Також виводить: “[Ім’я пилососа] повністю заряджено!”.

Очікуваний результат: Створено станцію. Створено 2-3 пилососи з низьким зарядом. Після виклику charge_all() у всіх об’єктів батарея має стати 100%.

↔︎️ Цей чудовий світ наслідування

Лінь — двигун прогресу в програмуванні. Уявіть, що ви хочете створити “розумну” мікрохвильовку. Вона робить все те саме, що й звичайна, але додатково підключається до Wi-Fi. Замість того, щоб копіювати і переписувати весь код звичайної мікрохвильовки з нуля, ми можемо її успадкувати. Базовий клас віддасть нам усі свої властивості та методи, а нам залишиться лише дописати нові фічі або змінити стару поведінку (це називається поліморфізмом).

👨‍💻 Live Coding 3: Передові технології

Контекст: Оскільки наша кухня має бути не просто кухнею, а найбільш технологічним кухонним чудом, нам треба мати найбільш сучасне остаткування. Тому ми вирішили створити розумну мікрохвильовку, яка буде підключатися до Wi-Fi і виконувати свої функції лише тоді, коли вона підключена до інтернету. Створіть клас SmartMicrowave, який наслідує Microwave та має цю додаткову функціональність.

Вхідні дані: - Клас SmartMicrowave, який наслідує Microwave. - Новий атрибут в __init__: wifi_connected (True/False). - Перевизначений метод heat(). Тепер перед тим як гріти, вона перевіряє Wi-Fi. Якщо інтернету немає, вона відмовляється працювати.

Очікуваний результат: Створена розумна мікрохвильовка, яка без підключення до мережі відмовляється гріти бутерброд.

🛠 Guided Practice

Контекст: Оскільки наша кухня тепер має сучасну мікрохвильовку, вона також має мати відповідний пилосос! Створіть клас SmartRobotVacuum, який наслідує RobotVacuum і має додаткову функціональність: він вміє розмовляти, тому коли він починає прибирання, він вітає вас і повідомляє про свій статус; також, коли він застрягає, замість звичайного beep, він повідомляє про це голосом.

Вхідні дані:

  • Клас SmartRobotVacuum, який наслідує RobotVacuum.
  • Перевизначений метод get_stuck(), який замість жалібного писку повертає фразу
  • Перевизначений метод clean(), який виводить повідомлення: “Привіт! Я [Ім’я], і я починаю прибирання!” перед тим, як зменшити батарею.

Очікуваний результат: Створено розумного робота-пилососа, який вітає вас перед прибиранням і повідомляє про застрягання голосом.

 

© 2025 Vadym Katsel. All rights reserved.