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

Наслідування

📖 Теорія
Наслідування дозволяє створити новий клас на основі існуючого.

Дочірній клас отримує всі атрибути та методи батьківського, і може:
• Додавати нові атрибути та методи
• Перевизначати методи батька

super() — виклик методу батьківського класу.

Переваги:
• Повторне використання коду
• Розширення функціональності без дублювання
• Логічна ієрархія (Тварина -> Собака -> Пудель)
💡 Приклад коду
Вивід:

                        
📝 ЗАВДАННЯ (3)
1.
Завдання 1: Ієрархія фігур
10 XP
Створіть клас Shape з методом area(), що повертає 0. Створіть дочірні класи Rectangle та Circle з правильним розрахунком площі.
💡 Підказка: import math та використовуйте math.pi для кола
🔓 Розв'язок:
import math
class Shape:
    def area(self): return 0
class Rectangle(Shape):
    def __init__(self, w, h):
        self.w, self.h = w, h
    def area(self): return self.w * self.h
class Circle(Shape):
    def __init__(self, r):
        self.r = r
    def area(self): return math.pi * self.r ** 2

print(Rectangle(4, 5).area())
print(f'{Circle(3).area():.2f}')
Вивід:

                                

2.
Завдання 2: Ієрархія тварин
20 XP
Створіть базовий клас Animal з атрибутами name та age, методом info(). Створіть дочірні класи Dog та Cat. Dog має додатковий метод fetch() (принести м'яч), Cat — метод purr() (муркотіти). У кожного свій звук у методі speak(). Створіть по 2 об'єкти кожного класу та продемонструйте всі методи.
💡 Підказка: У дочірніх класах викликайте super().__init__(name, age) для ініціалізації батьківських атрибутів. Додайте свої методи та перевизначте speak().
🔓 Розв'язок:
class Animal:
    def __init__(self, name, age):
        self.name = name
        self.age = age
    def info(self):
        print(f'{self.name}, {self.age} років')
    def speak(self):
        print(f'{self.name} видає звук')

class Dog(Animal):
    def __init__(self, name, age, breed):
        super().__init__(name, age)
        self.breed = breed
    def speak(self):
        print(f'{self.name} каже: Гав-гав!')
    def fetch(self):
        print(f'{self.name} приніс м\'ячик!')

class Cat(Animal):
    def __init__(self, name, age, color):
        super().__init__(name, age)
        self.color = color
    def speak(self):
        print(f'{self.name} каже: Мяу!')
    def purr(self):
        print(f'{self.name} муркоче: мрр...')

dog1 = Dog('Рекс', 3, 'Вівчарка')
dog2 = Dog('Бобик', 5, 'Дворняга')
cat1 = Cat('Мурка', 2, 'рудий')
cat2 = Cat('Барсик', 4, 'сірий')

for animal in [dog1, dog2, cat1, cat2]:
    animal.info()
    animal.speak()
dog1.fetch()
cat1.purr()
Вивід:

                                

3.
Завдання 3: Система співробітників
30 XP
Створіть базовий клас Employee з атрибутами name та base_salary. Створіть дочірні класи Manager (має бонус у відсотках) та Developer (має кількість проєктів, за кожний +5000). Кожен клас перевизначає метод total_salary(). Створіть по парі об'єктів та виведіть зарплату кожного.
💡 Підказка: У Manager: total_salary = base_salary * (1 + bonus/100). У Developer: total_salary = base_salary + projects * 5000. Використовуйте super().__init__() у дочірніх класах.
🔓 Розв'язок:
class Employee:
    def __init__(self, name, base_salary):
        self.name = name
        self.base_salary = base_salary
    def total_salary(self):
        return self.base_salary
    def __str__(self):
        return f'{self.name}: {self.total_salary():.0f} грн.'

class Manager(Employee):
    def __init__(self, name, base_salary, bonus_percent):
        super().__init__(name, base_salary)
        self.bonus_percent = bonus_percent
    def total_salary(self):
        return self.base_salary * (1 + self.bonus_percent / 100)

class Developer(Employee):
    def __init__(self, name, base_salary, projects):
        super().__init__(name, base_salary)
        self.projects = projects
    def total_salary(self):
        return self.base_salary + self.projects * 5000

team = [
    Manager('Олексій', 100000, 20),
    Manager('Олена', 120000, 15),
    Developer('Діма', 90000, 3),
    Developer('Маша', 95000, 2)
]
print('=== Зарплати команди ===')
for emp in team:
    print(emp)
Вивід: