python ShoppingCart中面向对象的编程

时间:2017-03-08 00:14:39

标签: python python-3.x oop

创建一个名为ShoppingCart的类。

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

创建一个需要item_name,quantity和price参数的方法add_item。 此方法应将添加项的成本添加到当前总计的值。 它还应该在项目dict中添加一个条目,使得键是item_name 并且值是项目的数量。

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

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

创建一个方法结帐,其中包含cash_paid并从付款中返回余额值。 如果cash_paid不足以支付总额,则返回“现金支付不足”。

创建一个名为Shop的类,它有一个不带参数的构造函数,并在100处初始化一个名为quantity的属性。

确保Shop继承自ShoppingCart。

在Shop类中,覆盖remove_item方法,这样调用Shop的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

我真的需要一些帮助。

2 个答案:

答案 0 :(得分:1)

您的代码中存在的问题是add_item没有项添加到购物车中的现有项目集,它会将购物车的内容设置为新项目并制作它忘记了之前的情况。您需要考虑购物车的先前内容,因此可以在对add_item的单独调用中添加多个项目。

你的remove_item更接近正确,但我认为在删除所有请求类型的项目时删除整个items字典有点过于热心(它应该只删除一个键)使用del self.items[item_name]>应该是>=,或== >提出例外情况。)

答案 1 :(得分: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