2017-04-14 131 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是問題,謝謝。你做了什麼是有用的,它的榮耀並不是徒勞。 –