【问题标题】:Shopping cart function in pythonpython中的购物车功能
【发布时间】:2017-05-22 04:24:37
【问题描述】:

我目前在 python 中执行一项任务,我需要帮助,我正在

创建一个名为 ShoppingCart 的类。

创建一个没有参数的构造函数并将total属性设置为零,并初始化一个名为items的空dict属性。

创建需要 item_name、数量和价格参数的方法 add_item。此方法应将已添加项目的成本添加到总计的当前值中。它还应该在 items dict 中添加一个条目,以便 key 是 item_name 并且 value 是 item 的数量。

创建一个方法 remove_item,它需要与 add_item 类似的参数。它应该删除已添加到购物车且不需要的项目。此方法应从当前总数中扣除这些项目的成本,并相应地更新项目字典。如果要移除的商品数量超过购物车中的当前数量,则假定该商品的所有条目都将被移除。

创建一个方法 checkout 接受 cash_paid 并从付款中返回余额值。如果 cash_paid 不足以支付总额,则返回 Cashpaid not enough。

创建一个名为 Shop 的类,该类具有一个构造函数,该构造函数将一个名为 quantity 的属性初始化为 100。

确保 Shop 继承自 ShoppingCart。

在 Shop 类中,重写 remove_item 方法,这样在不带参数的情况下调用 Shop 的 remove_item 会将数量减一。

下面是这个的示例测试代码

import unittest;

class Test(unittest.TestCase):
def setUp(self):
    self.cart = ShoppingCart()
    self.shop = Shop()

def test_cart_property_initialization(self):
    self.assertEqual(self.cart.total, 0, msg='Initial value of total not correct')
    self.assertIsInstance(self.cart.items, dict, msg='Items is not a dictionary')

def test_add_item(self):
    self.cart.add_item('Mango', 3, 10)
    self.assertEqual(self.cart.total, 30, msg='Cart total not correct after adding items')
    self.assertEqual(self.cart.items['Mango'], 3, msg='Quantity of items not correct after adding item')

def test_add_item_hidden(self):
    self.cart.add_item('Mango', 3, 10)
    self.cart.add_item('Orange', 16, 10)
    self.assertEqual(self.cart.total, 190, msg='Cart total not correct after adding items')
    self.assertEqual(self.cart.items['Orange'], 16, msg='Quantity of items not correct after adding item')

def test_remove_item(self):
    self.cart.add_item('Mango', 3, 10)
    self.cart.remove_item('Mango', 2, 10)
    self.assertEqual(self.cart.total, 10, msg='Cart total not correct after removing item')
    self.assertEqual(self.cart.items['Mango'], 1, msg='Quantity of items not correct after removing item')

def test_remove_item_hidden(self):
    self.cart.add_item('Mango', 3, 10)
    self.cart.add_item('Orange', 16, 10)
    self.cart.remove_item('Mango', 2, 10)
    self.assertEqual(self.cart.total, 170, msg='Cart total not correct after removing item')
    self.assertEqual(self.cart.items['Mango'], 1, msg='Quantity of items not correct after removing item')
    self.cart.remove_item('Mango', 2, 10)
    self.assertEqual(self.cart.total, 160, msg='Cart total not correct after removing item')
    with self.assertRaises(KeyError):
        self.cart.items['Mango']

def test_checkout_returns_correct_value(self):
    self.cart.add_item('Mango', 3, 10)
    self.cart.add_item('Orange', 16, 10)
    self.assertEqual(self.cart.checkout(265), 75, msg='Balance of checkout not correct')
    self.assertEqual(self.cart.checkout(25), 'Cash paid not enough', msg='Balance of checkout not correct')


def test_shop_is_instance_of_shopping_cart(self):
    self.assertTrue(isinstance(self.shop, ShoppingCart), msg='Shop is not a subclass of ShoppingCart')

def test_shop_initializaton(self):
    self.assertEqual(self.shop.quantity, 100, msg='Shop quantity not initialized correctly')

def test_shop_remove_item_method(self):
    for i in range(15):
        self.shop.remove_item()

    self.assertEqual(self.shop.quantity, 85)

我尝试用下面的代码解决这个问题

class ShoppingCart(object):

  def __init__(self):
      self.total = 0 
      self.items = {}

  def add_item(self,item_name,quantity,price):
      self.items[item_name] = quantity
      self.total += price*quantity

  def remove_item(self,item_name,quantity,price):
      if quantity < self.items[item_name] and quantity >= 0:
          self.total -= price*quantity
          self.items[item_name] -= quantity
      elif quantity >= self.items[item_name] :
          del self.items[item_name]

  def checkout(self,cash_paid):
      if cash_paid >= self.total:
          return cash_paid - self.total
      else:
          return "Cash paid not enough"

class Shop(ShoppingCart):
  def __init__(self):
      self.quantity = 100

  def remove_item(self):
      self.quantity -= 1

所有其他任务都已解决,但我在运行测试时返回的错误是

 test_remove_item_hidden
 170 != 160 : Cart total not correct after removing item

我似乎找不到问题所在。考虑到我是 python 新手,请提供任何帮助。提前致谢。

【问题讨论】:

  • 这句话quantity &lt; self.items[item_name] 似乎不对。看起来它的目的是检查self.items[item_name] 是否存在。
  • @SpencerWieczorek 我不明白你的意思

标签: python


【解决方案1】:

删除时,else case 调用del,它只会删除商品,但不会更新购物车总数。您应该首先使用该数量从总数中降低价格:

...
else:
    self.total -= price*self.items[item_name]
    del self.items[item_name]
...

【讨论】:

  • 您确定您已将其添加到正确的位置吗?我现在已经执行了您的代码,并且添加了以上行后所有测试都通过了。
猜你喜欢
  • 1970-01-01
  • 2013-11-02
  • 1970-01-01
  • 2013-07-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
相关资源
最近更新 更多