Нашли ошибку?
Скачать чистый
мини-проект≈ 20 минупражнения: 0 из 5

Мини-проект: корзина

Класс Cart хранит товары в списке: добавить, убрать, посчитать сумму, найти самый дорогой. Две независимые корзины и товар, который лежит в обеих.

Python запустится при первом выполнении

Касса «Кофейной лавки» собирает заказ в корзину: бариста добавляет товары, покупатель передумывает и что-то убирает, а в конце касса считает сумму. Корзина — объект, который хранит другие объекты, товары. В проекте пригодится всё из модуля: свой список у каждого экземпляра, ссылки на объекты и is.

Что у нас уже есть

Товар — уже знакомый класс с названием и ценой:

[ ]Класс Product
class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price


latte = Product("Латте", 220)
print(latte.name, latte.price)
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
Латте 220

Шаг 1. Корзина

[ ]Упражнение 1Класс Cart решено

Допишите класс Cart. У новой корзины — пустой список items, свой у каждой корзины. Метод add(product) кладёт товар в корзину, метод total() возвращает сумму цен всех товаров (у пустой корзины — 0).

class Cart:
    def __init__(self):
        ...

    def add(self, product):
        ...

    def total(self):
        ...

Шаг 2. Убрать и найти

[ ]Упражнение 2remove и most_expensive решено

Добавьте в класс два метода — скопируйте класс из шага 1 целиком и допишите их:

  • remove(name) убирает из корзины первый товар с таким названием и возвращает True; если такого товара нет — ничего не меняет и возвращает False;
  • most_expensive() возвращает самый дорогой товар корзины (сам объект), а у пустой корзины — None.
class Cart:
    # скопируйте сюда __init__, add и total из шага 1

    def remove(self, name):
        ...

    def most_expensive(self):
        ...

Шаг 3. Две корзины

[ ]Упражнение 3Анна и Борис решено

Создайте две корзины: anna — с латте и круассаном, boris — с чаем и латте. Латте — один и тот же товар latte из заготовки: в меню он один. Сохраните суммы корзин в anna_total и boris_total.

latte = Product("Латте", 220)
croissant = Product("Круассан", 140)
tea = Product("Чай", 120)

anna = ...
boris = ...
anna_total = ...
boris_total = ...

Шаг 4. Цена изменилась

Пока покупатели стоят в очереди, кофейня поднимает цену латте до 250 ₽.

[ ]Упражнение 4Новая цена латте решено

Измените цену товара latte на 250 и сохраните новые суммы корзин в anna_new и boris_new. Товары в корзины заново не добавляйте.

anna_new = ...
boris_new = ...

Шаг 5. Борис передумал

[ ]Упражнение 5Чай на раф решено

Борис передумал: уберите из его корзины чай и добавьте раф raf. Результат remove для чая сохраните в removed, а в missing — результат попытки убрать какао, которого в корзине нет. Самый дорогой товар корзины Бориса после замены сохраните в boris_top.

raf = Product("Раф", 260)
removed = ...
missing = ...
boris_top = ...

Итог

[ ]Корзины на кассе
for name, cart in [("Анна", anna), ("Борис", boris)]:
    names = ", ".join(p.name for p in cart.items)
    print(f"{name}: {names} — {cart.total()} ₽")
print("латте в обеих корзинах — один объект:", anna.items[0] is boris.items[0])
Выводсохранённый · нажмите «Выполнить», чтобы получить свой
Анна: Латте, Круассан — 390 ₽
Борис: Латте, Раф — 510 ₽
латте в обеих корзинах — один объект: True
Итог появится, когда решите все упражнения урока, — в нём ответы. Ячейку можно и выполнить.

Цена латте поменялась один раз — и сразу в обеих корзинах: корзины хранят не копии товаров, а ссылки на один объект latte. В кассе это удобно (новая цена видна везде), но значит и обратное: изменить товар «только для одной корзины» нельзя — для этого нужен отдельный объект.

Выводы с ответами появятся, когда решите все упражнения урока.

Корзина — первый пример композиции (composition): объект хранит другие объекты и работает с ними через их атрибуты и методы. Подробно о композиции — в модуле 6. А в следующем модуле научимся защищать состояние объекта: чтобы цену нельзя было случайно сделать отрицательной.

Практика по модулю

Задачи по ООП в Python для самостоятельной практики появятся в разделе «Задачи → ООП в Python».

Нашли ошибку?