Подготовка к Экзамену ООП
Note
Самостоятельная подготовка к лайвкодингу. На экзамене может быть одна большая задача, но ее части обычно повторяют темы из модуля: функции, классы, наследование, инкапсуляция, полиморфизм и абстракция.
Содержание
- Функции
- Методы объекта
- Методы класса и статические методы
- Наследование
- Полиморфизм
- Абстракция
- Инкапсуляция
Задание 1: восстановление энергии
Тема: функции.
- Напишите функцию
restore_energy, которая принимает два параметра:current_energy- текущая энергия персонажа;bonus- количество энергии, которое нужно добавить.
- Максимальная энергия равна
120. - Если итоговое значение больше максимума, вернуть
120. - Вернуть новое значение энергии.
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: торговец предметами
Тема: методы объекта.
- Создайте класс
ItemTrader. - В конструкторе примите количество денег
coins. - Добавьте метод
buy_item(item_name, item_price). - Если денег хватает, уменьшите баланс и выведите сообщение о покупке.
- Если денег не хватает, выведите
Недостаточно средств!.
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: торговец с налогом
Тема: методы класса и статические методы.
- Создайте класс
MarketMerchantс атрибутом экземпляраcoins. - Добавьте статический метод
tax_rate(), который возвращает0.12. - Добавьте метод класса
from_premium_account(cls), который создает торговца с1500монетами. - Реализуйте
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: специалист и аналитик
Тема: наследование.
- Создайте базовый класс
TeamMemberс атрибутами:name;energy.
- Добавьте метод
spend_energy(amount), который уменьшает энергию. - Создайте два дочерних класса:
Developerс методомwork(), который возвращаетПишет код: -25 энергии;Analystс методомwork(), который возвращаетГотовит анализ: -15 энергии.
- Создайте объекты и вызовите методы.
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: одинаковый метод у разных ролей
Тема: полиморфизм.
- Создайте классы
DesignerиEngineer. - У каждого класса должен быть метод
daily_task():- у
DesignerвозвращаетГотовит макет интерфейса; - у
EngineerвозвращаетРеализует функциональность.
- у
- Напишите функцию
run_day(member), которая принимает объект и печатает результатdaily_task(). - Проверьте функцию с обоими классами.
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: обработчики отчетов
Тема: абстракция.
- Создайте абстрактный класс
ReportExporterс абстрактным методомexport. - Создайте два класса:
PdfExporter, методexportвозвращаетPDF-отчет сформирован;CsvExporter, методexportвозвращаетCSV-отчет сформирован.
- Создайте объекты и вызовите
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: учебный счет
Тема: инкапсуляция.
- Создайте класс
LearningWallet. - У класса должен быть приватный атрибут
__coins. - В конструкторе принимайте начальное количество монет. Если оно отрицательное, вызывайте
ValueError. - Реализуйте методы:
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)
Как тренироваться перед экзаменом
- Сначала решайте без подсказок.
- Если застряли, сформулируйте точный вопрос: что именно непонятно.
- После решения измените числа, имена классов и условия, затем решите еще раз.
- Обязательно запускайте код и читайте ошибки.
- Если используете ИИ, просите объяснение или намек, а не готовую финальную версию.
⬅️ Назад: 03.07 - Что такое импорт в Python | Далее: 04 - MOC ➡️ Модуль: 03 - MOC