2017-03-08 126 views
-3

创建一个名为ShoppingCart的类。python ShoppingCart中的面向对象编程

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

创建一个方法add_item,它需要item_name,数量和价格参数。 此方法应该将添加项目的成本添加到当前总值中。 它还应该添加一个条目词典,使关键是item_name 和值是该项目的数量。

创建一个方法remove_item,它需要与add_item类似的参数。它应该删除已添加到购物车并且不需要的商品。此方法应从当前总计中扣除已移除项目的成本,并相应地更新项目字典。

如果要移除的物品的数量超过购物车中该物品的当前数量,则假定该物品的所有条目都将被移除。

创建一个方法checkout,它接受cash_paid并从付款中返回余额值。 如果cash_paid不足以支付总额,则返回“支付的现金不足”。

创建具有构造函数不带任何参数,并初始化名为量的属性在100

确保店铺从我的购物继承的类名为店。

在店铺等级,由一个覆盖remove_item方法,例如,调用店的不带参数的remove_item递减量“””

这是我更新的代码。

class ShoppingCart(object): 

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

    def add_item(self, item_name, quantity, price): 
    self.total = (quantity * price) 
    self.items = {item_name : quantity} 

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

    def checkout(self, cash_paid): 
    balance = 0 
    if cash_paid < self.total: 
     return "Cash paid not enough" 
    balance = cash_paid - self.total 
    return balance 


class Shop(ShoppingCart): 

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

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


import unittest 

    class ShoppingCartTestCases(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_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_checkout_returns_correct_balance(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_remove_item_method(self): 
      for i in range(15): 
       self.shop.remove_item() 

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

运行unittest后,test.checkout_returns_correct_balance失败。 这是我得到的消息: self.assertEqual(self.cart.checkout(265), 75, msg='Balance of checkout not correct') AssertionError: 105 != 75 : Balance of checkout not correct

我真的需要一些帮助。

+0

哪些测试?预期产出是多少?观察到的输出是什么?你不能只抛弃作业描述和一堆代码,并期望我们从头开始。 – ShadowRanger

+0

@ShadowRanger'add_item'方法和'remove_item'方法,我没有实现正确的代码..你可以通过它,代码是非常凌乱 – Manny

+0

不幸的是,“代码是相当混乱”是一个很好的我们的理由*不*通过您的代码。我们没有付出代价来调试你的代码,而且乱糟糟的代码没有什么好玩的。也许你应该清理它,看看问题是否对你更清楚?如果没有,也许你会把问题缩小到可以变成[mcve]的地步。 – Blckknght

回答

1

你在你的代码有问题是add_item添加项目现有的一组在车中的物品的,它设置你的购物车中的内容到新的项目,并使其忘掉它收到了。您需要考虑购物车以前的内容,因此可以通过单独拨打add_item来添加多个项目。

remove_item更接近正确的,但我认为这是一个有点过分热心于当请求类型的所有项目已被删除删除整个items字典(它可能应该只删除一个键与del self.items[item_name]>应可能是>=,或者==>引发异常)。

+0

我想到'add_item'不会将新项目添加到现有购物车中......但是我找不到它的方式......你能帮我解决吗? – Manny

+0

在基本级别上,使用'+ ='而不是'='。可能需要一些额外的逻辑来处理'items'字典。 (使用'collections.defaultdict'类会使它变得非常简单,但你也应该学会如何使它与一个普通的字典一起工作。) – Blckknght

+0

我确实再次运行了测试,它通过了,但是当我尝试提交代码时该平台......我得到一个消息,说明它未能通过所有的测试......类似这样的事情'KeyError('Mango'),'可能会造成这种情况,我已经检查了三倍的代码。 .. – Manny

1

试试这个:

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

    def add_item(self, item_name, quantity, price): 
     self.total += price*quantity 
     self.items.update({item_name: quantity}) 

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


     elif quantity >= self.items[item_name]: 
      self.total -= price*self.items[item_name] 
      del self.items[item_name] 


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

class Shop(ShoppingCart): 

    def __init__(self): 
     self.quantity = 100 

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