2017-04-14 19 views
-2

私はいくつかの演習で私の手を試して、これに来て:Pythonでオブジェクト指向プログラミング

ShoppingCartと呼ばれるクラスを作成します。

引数をとらないコンストラクタを作成し、total属性をゼロに設定し、itemsという空のdict属性を初期化します。

item_name、quantityおよびprice引数を必要とするadd_itemメソッドを作成します。このメソッドは、追加されたアイテムのコストを現在の合計値に追加する必要があります。また、項目dictに項目を追加して、その項目のキーがitem_nameであり、値が項目の数量であるようにする必要があります。

add_itemと同様の引数を必要とするremove_itemメソッドを作成します。ショッピングカートに追加されたアイテムは削除する必要がありません。このメソッドは、現在の合計から削除されたアイテムのコストを差し引き、それに応じてアイテムの辞書を更新する必要があります。

削除するアイテムの数量がカート内のそのアイテムの現在の数量を超える場合は、そのアイテムのすべてのエントリを削除するとします。

cash_paidを受け取り、支払いの残高の値を返すメソッドチェックアウトを作成します。 cash_paidで総額をカバーできない場合は、「現金で十分ではありません」と返します。

引数を取らず、100

で数量と呼ばれる属性がショップのShoppingCartから継承していることを確認し初期化するコンストラクタを持っているショップと呼ばれるクラスを作成します。

Shopクラスでは、remove_itemメソッドをオーバーライドします。これにより、Shopを呼び出すremove_itemが引数なしで量を1減らします。

これを書いて(以下を参照)、すべてのテストに合格しましたが、私が練習をしているプラ​​ットフォームでそれを提出しようとすると、このエラーが返されます>> >> KeyError( 'マンゴー')、これの原因は何ですか?どのように私はそれを解決することができますか?それはすべてのテストをasses場合は、コードが行くのが良いというわけではないのですか?私はこだわっている

CODE

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 

TEST

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にあなたは、そこにあるよりも多くの量を削除するには、私はアイテムを追加することができますし、それらを削除し1を許可し、私は無料のフルーツを手に入れることができた:

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が問題だった、ありがとう。あなたがしたことは有用であり、その栄光は無駄ではありません。 –

関連する問題