### Задача 5. Библиотека (ООП - Инкапсуляция и Взаимодействие) **Постановка** * **Книга:** Имеет название, автора и статус (*"В библиотеке"*, *"Выдана"*). Может менять свой статус на противоположный. * **Читатель:** Имеет имя и список взятых книг. Может брать и возвращать книги. * **Библиотека:** Содержит список всех доступных книг. Может выдавать книгу читателю. **Задание** **Класс `Book`:** 1. Создайте класс `Book`. 2. В `__init__(self, title, author)` определите свойства `title`, `author` и `status` (по умолчанию *"В библиотеке"*). 3. Создайте метод `change_status(self)`, меняющий статус книги на *"Выдана"*, если она в библиотеке, и обратно. **Класс `Reader`:** 1. Создайте класс `Reader`. 2. В `__init__(self, name)` сохраните имя и создайте пустой список `borrowed_books`. 3. Создайте метод `take_book(self, book)`, добавляющий переданную книгу в список. 4. Создайте метод `return_book(self, book)`, удаляющий книгу из списка. **Класс `Library`:** 1. Создайте класс `Library`. 2. В `__init__(self)` создайте список `books` и добавьте туда несколько книг по умолчанию. 3. Создайте метод `lend_book(self, book, reader)`, который проверяет статус книги, меняет его через метод книги на *"Выдана"* и передает читателю в его список. **Тесты:** 1. Создайте библиотеку. 2. Создайте читателя. 3. Используя библиотеку, выдайте читателю книгу. --- ### Задача 6. Магазин (ООП - Агрегация) **Постановка** * **Товар:** Имеет название и цену. * **Корзина:** Содержит список товаров. Может добавлять товар и считать общую стоимость. * **Покупатель:** Имеет имя, баланс и корзину. Может оплачивать корзину. **Задание** **Класс `Product`:** 1. Создайте класс `Product`. 2. Создайте метод `__init__(self, name, price)`. **Класс `Cart`:** 1. Создайте класс `Cart`. 2. В `__init__(self)` создайте пустой список `products`. 3. Создайте метод `add_product(self, product)`, добавляющий товар в список. 4. Создайте метод `get_total(self)`, возвращающий сумму цен всех товаров. **Класс `Customer`:** 1. Создайте класс `Customer`. 2. В `__init__(self, name, balance, cart)` сохраните переданные параметры. 3. Создайте метод `pay(self)`, который проверяет, хватает ли баланса для оплаты корзины. Если хватает — вычитает сумму из баланса и очищает корзину. Если нет — выводит предупреждение. **Тесты:** 1. Создайте несколько товаров. 2. Создайте корзину и добавьте в нее товары. 3. Создайте покупателя, передав ему корзину и баланс. 4. Заставьте покупателя оплатить товары в корзине.