Подготовка к Экзамену ООП

Note

Самостоятельная подготовка к лайвкодингу. На экзамене может быть одна большая задача, но ее части обычно повторяют темы из модуля: функции, классы, наследование, инкапсуляция, полиморфизм и абстракция.

Содержание

  1. Функции
  2. Методы объекта
  3. Методы класса и статические методы
  4. Наследование
  5. Полиморфизм
  6. Абстракция
  7. Инкапсуляция

Задание 1: восстановление энергии

Тема: функции.

  1. Напишите функцию restore_energy, которая принимает два параметра:
    • current_energy - текущая энергия персонажа;
    • bonus - количество энергии, которое нужно добавить.
  2. Максимальная энергия равна 120.
  3. Если итоговое значение больше максимума, вернуть 120.
  4. Вернуть новое значение энергии.
print(restore_energy(105, 30))  # 120
print(restore_energy(40, 25))   # 65
  • Решение

    def restore_energy(current_energy, bonus):
        max_energy = 120
        new_energy = current_energy + bonus
        if new_energy > max_energy:
            new_energy = max_energy
        return new_energy
     
    print(restore_energy(105, 30))
    print(restore_energy(40, 25))

Задание 2: торговец предметами

Тема: методы объекта.

  1. Создайте класс ItemTrader.
  2. В конструкторе примите количество денег coins.
  3. Добавьте метод buy_item(item_name, item_price).
  4. Если денег хватает, уменьшите баланс и выведите сообщение о покупке.
  5. Если денег не хватает, выведите Недостаточно средств!.
trader = ItemTrader(300)
trader.buy_item("Учебник Python", 180)  # Куплен Учебник Python
trader.buy_item("Механическая клавиатура", 200)  # Недостаточно средств!
  • Решение

    class ItemTrader:
        def __init__(self, coins):
            self.coins = coins
     
        def buy_item(self, item_name, item_price):
            if self.coins >= item_price:
                self.coins -= item_price
                print(f"Куплен {item_name}")
            else:
                print("Недостаточно средств!")
     
    trader = ItemTrader(300)
    trader.buy_item("Учебник Python", 180)
    trader.buy_item("Механическая клавиатура", 200)

Задание 3: торговец с налогом

Тема: методы класса и статические методы.

  1. Создайте класс MarketMerchant с атрибутом экземпляра coins.
  2. Добавьте статический метод tax_rate(), который возвращает 0.12.
  3. Добавьте метод класса from_premium_account(cls), который создает торговца с 1500 монетами.
  4. Реализуйте buy_item(item_name, item_price):
    • итоговая цена равна item_price + item_price * tax_rate();
    • если денег хватает, уменьшить баланс и вернуть сообщение о покупке;
    • если денег не хватает, вернуть Недостаточно средств!.
merchant = MarketMerchant(300)
print(merchant.buy_item("Подписка на курс", 220))
 
premium = MarketMerchant.from_premium_account()
print(premium.buy_item("Годовой доступ", 800))
  • Решение

    class MarketMerchant:
        def __init__(self, coins):
            self.coins = coins
     
        @staticmethod
        def tax_rate():
            return 0.12
     
        @classmethod
        def from_premium_account(cls):
            return cls(1500)
     
        def buy_item(self, item_name, item_price):
            total_price = item_price + item_price * self.tax_rate()
            if self.coins >= total_price:
                self.coins -= total_price
                return f"Куплен {item_name}"
            return "Недостаточно средств!"
     
    merchant = MarketMerchant(300)
    print(merchant.buy_item("Подписка на курс", 220))
     
    premium = MarketMerchant.from_premium_account()
    print(premium.buy_item("Годовой доступ", 800))

Задание 4: специалист и аналитик

Тема: наследование.

  1. Создайте базовый класс TeamMember с атрибутами:
    • name;
    • energy.
  2. Добавьте метод spend_energy(amount), который уменьшает энергию.
  3. Создайте два дочерних класса:
    • Developer с методом work(), который возвращает Пишет код: -25 энергии;
    • Analyst с методом work(), который возвращает Готовит анализ: -15 энергии.
  4. Создайте объекты и вызовите методы.
dev = Developer("Алина", 100)
analyst = Analyst("Роман", 90)
 
print(dev.work())
print(analyst.work())
  • Решение

    class TeamMember:
        def __init__(self, name, energy):
            self.name = name
            self.energy = energy
     
        def spend_energy(self, amount):
            self.energy -= amount
            print(f"{self.name} потратил {amount} энергии. Осталось: {self.energy}")
     
    class Developer(TeamMember):
        def work(self):
            self.spend_energy(25)
            return "Пишет код: -25 энергии"
     
    class Analyst(TeamMember):
        def work(self):
            self.spend_energy(15)
            return "Готовит анализ: -15 энергии"
     
    dev = Developer("Алина", 100)
    analyst = Analyst("Роман", 90)
     
    print(dev.work())
    print(analyst.work())

Задание 5: одинаковый метод у разных ролей

Тема: полиморфизм.

  1. Создайте классы Designer и Engineer.
  2. У каждого класса должен быть метод daily_task():
    • у Designer возвращает Готовит макет интерфейса;
    • у Engineer возвращает Реализует функциональность.
  3. Напишите функцию run_day(member), которая принимает объект и печатает результат daily_task().
  4. Проверьте функцию с обоими классами.
designer = Designer()
engineer = Engineer()
 
run_day(designer)
run_day(engineer)
  • Решение

    class Designer:
        def daily_task(self):
            return "Готовит макет интерфейса"
     
    class Engineer:
        def daily_task(self):
            return "Реализует функциональность"
     
    def run_day(member):
        print(member.daily_task())
     
    designer = Designer()
    engineer = Engineer()
     
    run_day(designer)
    run_day(engineer)

Задание 6: обработчики отчетов

Тема: абстракция.

  1. Создайте абстрактный класс ReportExporter с абстрактным методом export.
  2. Создайте два класса:
    • PdfExporter, метод export возвращает PDF-отчет сформирован;
    • CsvExporter, метод export возвращает CSV-отчет сформирован.
  3. Создайте объекты и вызовите export().
pdf = PdfExporter()
csv = CsvExporter()
 
print(pdf.export())
print(csv.export())
  • Решение

    from abc import ABC, abstractmethod
     
    class ReportExporter(ABC):
        @abstractmethod
        def export(self):
            pass
     
    class PdfExporter(ReportExporter):
        def export(self):
            return "PDF-отчет сформирован"
     
    class CsvExporter(ReportExporter):
        def export(self):
            return "CSV-отчет сформирован"
     
    pdf = PdfExporter()
    csv = CsvExporter()
     
    print(pdf.export())
    print(csv.export())

Задание 7: учебный счет

Тема: инкапсуляция.

  1. Создайте класс LearningWallet.
  2. У класса должен быть приватный атрибут __coins.
  3. В конструкторе принимайте начальное количество монет. Если оно отрицательное, вызывайте ValueError.
  4. Реализуйте методы:
    • get_coins() - возвращает баланс;
    • add_coins(amount) - добавляет монеты, если amount > 0;
    • spend_coins(amount) - списывает монеты, если средств достаточно;
    • если средств не хватает, выводит Недостаточно монет!.
wallet = LearningWallet(150)
print(wallet.get_coins())
wallet.add_coins(70)
wallet.spend_coins(40)
wallet.spend_coins(300)
  • Решение

    class LearningWallet:
        def __init__(self, initial_coins):
            if initial_coins < 0:
                raise ValueError("Начальный баланс не может быть отрицательным")
            self.__coins = initial_coins
     
        def get_coins(self):
            return self.__coins
     
        def add_coins(self, amount):
            if amount > 0:
                self.__coins += amount
                print(f"Добавлено {amount}. Баланс: {self.__coins}")
            else:
                print("Сумма должна быть больше 0")
     
        def spend_coins(self, amount):
            if amount > self.__coins:
                print("Недостаточно монет!")
            elif amount > 0:
                self.__coins -= amount
                print(f"Списано {amount}. Баланс: {self.__coins}")
            else:
                print("Сумма должна быть больше 0")
     
    wallet = LearningWallet(150)
    print(wallet.get_coins())
    wallet.add_coins(70)
    wallet.spend_coins(40)
    wallet.spend_coins(300)

Как тренироваться перед экзаменом

  1. Сначала решайте без подсказок.
  2. Если застряли, сформулируйте точный вопрос: что именно непонятно.
  3. После решения измените числа, имена классов и условия, затем решите еще раз.
  4. Обязательно запускайте код и читайте ошибки.
  5. Если используете ИИ, просите объяснение или намек, а не готовую финальную версию.

⬅️ Назад: 03.07 - Что такое импорт в Python | Далее: 04 - MOC ➡️ Модуль: 03 - MOC