Модуль 7: Основи ООП

Класи та об'єкти

📖 Теорія
ООП (об'єктно-орієнтоване програмування) — підхід, при якому програма будується з об'єктів.

Клас — шаблон (креслення) для створення об'єктів.
Об'єкт — конкретний екземпляр класу.

Аналогія: Клас — це рецепт торта. Об'єкт — конкретний спечений торт.

__init__ — конструктор, метод, який викликається при створенні об'єкта.
self — посилання на сам об'єкт (перший параметр усіх методів).

Атрибути — дані об'єкта (self.name).
Методи — функції об'єкта.
💡 Приклад коду
Вивід:

                        
📝 ЗАВДАННЯ (3)
1.
Завдання 1: Клас BankAccount
10 XP
Створіть клас BankAccount з атрибутами: owner (власник) та balance (баланс, за замовчуванням 0). Методи: deposit(amount) — поповнити, withdraw(amount) — зняти (з перевіркою, що вистачає грошей), get_balance() — показати баланс.
💡 Підказка: У withdraw перевірте if amount > self.balance
🔓 Розв'язок:
class BankAccount:
    def __init__(self, owner, balance=0):
        self.owner = owner
        self.balance = balance
    def deposit(self, amount):
        self.balance += amount
        print(f'Поповнено на {amount}. Баланс: {self.balance}')
    def withdraw(self, amount):
        if amount > self.balance:
            print('Недостатньо коштів')
        else:
            self.balance -= amount
            print(f'Знято {amount}. Баланс: {self.balance}')
    def get_balance(self):
        return self.balance

acc = BankAccount('Діма', 1000)
acc.deposit(500)
acc.withdraw(200)
acc.withdraw(2000)
Вивід:

                                

2.
Завдання 2: Клас Student
20 XP
Створіть клас Student з атрибутами: name, grades (список оцінок, за замовчуванням порожній). Методи: add_grade(grade) — додати оцінку, get_average() — середній бал, get_status() — повертає 'Відмінник' (>=90), 'Хорошист' (>=75), 'Трієчник' (>=60) або 'Двієчник'. Метод __str__ повинен повертати гарний опис.
💡 Підказка: У get_average() не забудьте перевірити, що список оцінок не порожній (інакше ділення на нуль). Використовуйте sum()/len().
🔓 Розв'язок:
class Student:
    def __init__(self, name):
        self.name = name
        self.grades = []
    
    def add_grade(self, grade):
        self.grades.append(grade)
    
    def get_average(self):
        if not self.grades:
            return 0
        return sum(self.grades) / len(self.grades)
    
    def get_status(self):
        avg = self.get_average()
        if avg >= 90: return 'Відмінник'
        elif avg >= 75: return 'Хорошист'
        elif avg >= 60: return 'Трієчник'
        else: return 'Двієчник'
    
    def __str__(self):
        return f'{self.name}: середній бал {self.get_average():.1f} ({self.get_status()})'

s = Student('Іван')
for g in [85, 92, 78, 95, 88]:
    s.add_grade(g)
print(s)
Вивід:

                                

3.
Завдання 3: Клас TodoList
30 XP
Створіть клас TodoList (список справ). Атрибути: title (назва списку), tasks (список словників з ключами 'text' та 'done'). Методи: add(text), complete(номер), show() — показати всі завдання з позначками, count_done() — кількість виконаних.
💡 Підказка: Завдання зберігайте як словник {'text': 'купити молоко', 'done': False}. У complete() змінюйте done на True за індексом.
🔓 Розв'язок:
class TodoList:
    def __init__(self, title):
        self.title = title
        self.tasks = []
    
    def add(self, text):
        self.tasks.append({'text': text, 'done': False})
    
    def complete(self, number):
        if 1 <= number <= len(self.tasks):
            self.tasks[number - 1]['done'] = True
            print(f'Завдання "{self.tasks[number-1]["text"]}" виконано!')
        else:
            print('Невірний номер')
    
    def show(self):
        print(f'=== {self.title} ===')
        for i, task in enumerate(self.tasks, 1):
            mark = '[x]' if task['done'] else '[ ]'
            print(f'{i}. {mark} {task["text"]}')
    
    def count_done(self):
        return sum(1 for t in self.tasks if t['done'])

todo = TodoList('Мої справи')
todo.add('Купити продукти')
todo.add('Написати код')
todo.add('Погуляти')
todo.complete(2)
todo.show()
print(f'Виконано: {todo.count_done()} з {len(todo.tasks)}')
Вивід: