Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.12.2024, 19:32   #1
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 27
По умолчанию Программирование на Python методы и свойства(property)

Здравствуйте, помогите пожалуйста разобраться с задачей не проходит тест.

Последний штрих — создание класса корзины, куда пользователь будет складывать товары. Для этого нам понадобятся ранее созданные классы User и Product

Итак, создаем класс Cart, который содержит:

1.метод __init__, принимающий на вход экземпляр класса User . Его необходимо сохранить в атрибуте
user . Помимо этого, метод должен создать атрибут goods — пустой словарь (лучше использовать
defaultdict). Он нужен будет для хранения товаров и их количества (ключ словаря — товар,
значение — количество). И еще нам понадобится создать защищенный атрибут .__total со значением
0. В нем будет храниться итоговая сумма заказа

2.метод add принимает на вход экземпляр класса Product и необязательный аргумент — количество
товаров (по умолчанию 1). Метод add должен увеличить в корзине (атрибут goods) количество
указанного товара на переданное значение количества и пересчитать атрибут self.__total

3.метод remove принимает на вход экземпляр класса Product и необязательный аргумент —
количество товаров (по умолчанию 1). Метод remove должен уменьшить в корзине (атрибут goods)
количество указанного товара на переданное значение количества и пересчитать атрибут
self.__total. Обратите внимание на то, что количество товара в корзине не может стать
отрицательным, как и итоговая сумма;

4.свойство геттер total , которое возвращает значение self.__total;

5.метод order должен использовать метод payment из класса User и передать в него итоговую сумму
корзины. В случае, если средств пользователю хватило, вывести сообщение «Заказ оплачен», в
противном случае - «Проблема с оплатой»;

6.метод print_check , печатающий на экран чек. Он должен начинаться со строки

---Your check---

Затем выводится состав корзины в алфавитном порядке по названию товара в виде
{Имя товара} {Цена товара} {Количество товара} {Сумма}
И заканчивается чек строкой

---Total: {self.total}---

Пример использования класса Cart

billy = User('billy@rambler.ru')

emon = Product('lemon', 20)
carrot = Product('carrot', 30)

cart_billy = Cart(billy)
print(cart_billy.user) # Пользователь billy@rambler.ru, баланс - 0
cart_billy.add(lemon, 2)
cart_billy.add(carrot)
cart_billy.print_check()
''' Печатает текст ниже

---Your check---
carrot 30 1 30
lemon 20 2 40
---Total: 70---'''
cart_billy.add(lemon, 3)
cart_billy.print_check()
''' Печатает текст ниже
---Your check---
carrot 30 1 30
lemon 20 5 100
---Total: 130---'''
cart_billy.remove(lemon, 6)
cart_billy.print_check()
''' Печатает текст ниже
---Your check---
carrot 30 1 30
---Total: 30---'''
print(cart_billy.total) # 30
cart_billy.add(lemon, 5)
cart_billy.print_check()
''' Печатает текст ниже
---Your check---
carrot 30 1 30
lemon 20 5 100
---Total: 130---'''
cart_billy.order()
''' Печатает текст ниже
Не хватает средств на балансе. Пополните счет
Проблема с оплатой'''
cart_billy.user.deposit(150)
cart_billy.order() # Заказ оплачен
print(cart_billy.user.balance) # 20

Тест

Failed. You answer was:
---Your check---
carrot 30 1 30
lemon 20 0 0
zara 1530 5 7650
---Total: 7680--
---Your check---
carrot 30 1 30
lemon 20 3 60
zara 1530 5 7650
---Total: 7740--
---Your check---
carrot 30 1 30
lemon 20 0 0
zara 1530 5 7650
---Total: 7680--
7680
---Your check---
carrot 30 1 30
lemon 20 5 100
zara 1530 5 7650
---Total: 7780--
Не хватает средств на балансе. Пополните счет
Проблема с оплатой
Заказ оплачен
370

Correct answer was:
---Your check---
carrot 30 1 30
zara 1530 5 7650
---Total: 7680---
---Your check---
carrot 30 1 30
lemon 20 3 60
zara 1530 5 7650
---Total: 7740---
---Your check---
carrot 30 1 30
zara 1530 5 7650
---Total: 7680---
7680
---Your check---
carrot 30 1 30
lemon 20 5 100
zara 1530 5 7650
---Total: 7780---
Не хватает средств на балансе. Пополните счет
Проблема с оплатой
Заказ оплачен
370

Код:
class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price


class User:
    def __init__(self, login, balance=0):
        self.login = login
        self.balance = balance

    def __str__(self):
        return f"Пользователь {self.login}, баланс - {self.balance}"

    @property
    def balance(self):
        return self.__balance

    @balance.setter
    def balance(self, new_balance):
        self.__balance = new_balance

    def deposit(self, plus_balance):
        if not isinstance(plus_balance, (int, float)):
            raise TypeError("Добавить к депозиту можно только числовое значение")
        self.__balance += plus_balance

    def payment(self, minus_balance):
        if not isinstance(minus_balance, (int, float)):
            raise TypeError("Нельзя оплачивать нечисловыми значениями")
        if minus_balance > self.__balance:
            print("Не хватает средств на балансе. Пополните счет")
            return False
        else:
            self.__balance -= minus_balance
            return True


class Cart:
    def __init__(self, User):
        self.user = User
        self.goods = {}
        self.__total = 0

    def add(self, Product, count=1):
        self.goods[Product] = self.goods.get(Product, 0) + count
        self.__total += count * Product.price

    def remove(self, Product, count=1):
        if count > self.goods[Product]:
            count = self.goods[Product]
            self.goods[Product] = self.goods.get(Product, 0) - count
            self.__total -= count * Product.price

    @property
    def total(self):
        return self.__total

    def order(self):
        if self.user.payment(self.__total):
            print('Заказ оплачен')
        else:
            print('Проблема с оплатой')

    def print_check(self):
        print('''---Your check---''')
        for k, v in sorted(self.goods.items(), key=lambda x: x[0].name):
            print(k.name, k.price, v, k.price * v)
        print(f'---Total: {self.total}--')

Последний раз редактировалось Nicodim; 02.12.2024 в 19:52.
Nicodim вне форума Ответить с цитированием
Старый 02.12.2024, 20:10   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,394
По умолчанию

Код:
class Cart:
    def __init__(self, user):
        self.user = user
        self.goods = defaultdict(int)
        self.__total = 0

    def add(self, product, count=1):
        self.goods[product] += count
        self.__total += count * product.price

    def remove(self, product, count=1):
        if product not in self.goods:
            return
        if count > self.goods[product]:
            count = self.goods.pop(product)
        else:
            self.goods[product] -= count
        self.__total -= count * product.price

    @property
    def total(self):
        return self.__total

    def order(self):
        if self.user.payment(self.__total):
            print('Заказ оплачен')
        else:
            print('Проблема с оплатой')

    def print_check(self):
        print('---Your check---')
        for k, v in sorted(self.goods.items(), key=lambda x: x[0].name):
            print(k.name, k.price, v, k.price * v)
        print(f'---Total: {self.total}---')
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.12.2024, 21:48   #3
Nicodim
Пользователь
 
Регистрация: 31.05.2023
Сообщений: 27
По умолчанию

Благодарю за помощь!!!
Nicodim вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Программирование на Python Магические методы в классах Nicodim Помощь студентам 2 10.09.2023 20:25
потоки(TThread) и свойства(property), не все понятно Pcrepair Общие вопросы Delphi 5 04.06.2018 21:21
Notice: Trying to get property of non-object. для property of static property Jakethefish PHP 8 16.08.2011 16:09
свойства и методы SkrudjMakdak Общие вопросы Delphi 1 13.09.2010 20:25
Свойства и методы в VBA NitriNKa Помощь студентам 0 07.05.2009 14:17