2017-04-14 105 views
-2

我正在尝试我的一些练习,来到这一个:面向对象的python编程

创建一个名为ShoppingCart的类。

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

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

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

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

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

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

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

在Shop类中,重写remove_item方法,例如调用Shop的remove_item(不带参数)数量减一。

写了这个(见下文)并通过测试运行它(见下文),它通过了所有的测试,但是当试图在我正在进行的练习平台上提交时,它返回了这个错误>> >> KeyError('芒果'),这可能是什么原因?我该如何解决它?如果它评估所有的测试,这是不是意味着代码是好的?我很卡

守则

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[item_name] 
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) 
+0

提示:写一个测试,增加芒果和橙子的购物车。然后检查两者是否仍在'self.cart.items'中。 – Kevin

+4

请将其降至[最小,完整和可验证示例](https://stackoverflow.com/help/mcve)。这个问题需要更多的代码和解释。此外,缩进不正确。 – roganjosh

回答

2

的方法add_item执行不正确。

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

这条线:

self.items = {item_name : quantity} 

应该是:

self.items[item_name] = self.items.get(item_name, 0) + quantity 
在remove_item

你也允许一个删除之外还有更多的数量,我可以添加项目,然后删除它们,我可以得到免费的水果:

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

应该是这样的:

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

@roganjosh对此抱歉,为了确保您了解整个问题,我重载了它。道歉 –

+0

D的remove_item是问题,谢谢。你做了什么是有用的,它的荣耀并不是徒劳。 –