面向对象编程&覆盖Python

时间:2017-04-11 13:18:56

标签: python python-2.7 oop

我试图用Python在OOP上完成一个实验室 该作业包括创建一个'ShoppingCart'和'Shop'类,其中'Shop'继承自'ShoppingCart'。

在Shopping Cart类中,是一个不带参数的构造函数,并将'total'属性设置为零,并初始化一个名为'items'的空dict属性。
还要创建以下方法'add_item','remove_item'(两者都需要类似的参数:item_name,quantity,price); 'add_item'方法应该将添加项的成本添加到当前总值中,并在'items'字典中添加一个条目,使得键为'item_name',值为'quantity',而'remove_item'方法反过来;以及“结账”方法,该方法接收'cash_paid'并从付款

返回余额

'Shop'类有一个不带参数的构造函数,并在100处初始化属性'quantity' 还需要覆盖'remove_item'方法,以便调用没有参数的Shop的'remove_item'将数量减1。

我在' Shop'中不断收到与超级方法相关的堆栈跟踪错误。类。

到目前为止,这是我的代码:

class ShoppingCart:

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

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

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

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

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

   def __remove_item (self):
      self.__quantity -= 1

我的add_item和remove_item方法似乎也会引发错误,但我不知道自己做错了什么。

这些是实验室的单元测试,它真的很有挑战性:

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)

1 个答案:

答案 0 :(得分:0)

  

我不断收到与“Shop”类中的super方法相关的堆栈跟踪错误

也许是因为......

  

在Shopping Cart类中是一个不带参数的构造函数

并且您尝试将数量作为参数传递给无参数构造函数

此外,quantity是一个未定义的变量

此外,为什么购物车会有单一的商品名称?或者只是最后添加或删除的项目的大小/价格?

def add_item(self, item_name, quantity, price):
    self.price = price
    self.item_name = item_name
    self.quantity = quantity

def remove_item(self,item_name, quantity, price):
    self.price = price
    self.quantity = quantity
    self.item_name = item_name

我想你想要一个Item课程,你的购物车里面有一个列表,而不是字典

原因是:你有一个只能容纳单键的词典。只要删除一个items[item_name],无论“数量”如何,都会清空所有具有该名称的项目。