見出し画像

[Python]オブジェクトで作る買い物カゴ

1.買い物カゴをクラスで表現

Amazonや楽天などのECサイトでよく見かける買い物カゴやカートをクラスで表現するとしたら、どうなるか今回やってみました。
買い物カゴには以下の5つの機能があると考えました。また、用意するオブジェクトは買い物カゴとそれに追加する商品オブジェクトの2つになります。

1.商品を買い物カゴに追加する
2.追加された商品の一覧表示
3.追加された商品の合計金額
4.追加された商品の合計数
5.カゴの中の商品の削除

2.買い物カゴオブジェクト

買い物カゴオブジェクトを作成します。まず、カゴというだけに追加される商品を保管する場所が必要なので、辞書を用意します。また、上記5つの機能を満たす関数を名前だけで何が処理されているわかるよう記述していきます。

#買い物カゴクラス
class Basket:
    product_dic = {}

    def add(self, product):
       pass

    def show_dic(self):
       pass
    
    def show_total_price(self):
        pass

    def show_total_num(self):
        pass

    def remove(self, product_name):
        pass

3.商品オブジェクト

商品には商品名、値段、数量という性質があるとし、以下のように表現しました。

#商品クラス
class Product:
    name = ""
    price = 0
    num = 0

4.買い物カゴの機能実装

4-1.商品を買い物カゴに追加する

追加された商品名をキーに、商品オブジェクトを値として、カゴクラスで定義したproduct_dicの辞書に追加します。

def add(self, product):
        self.product_dic[product.name] = product

4-2.追加された商品の一覧表示

product_dicから商品をfor文で取り出します。この時、それぞれのオブジェクトに格納されている情報から商品名、数量、合計金額を出力します。
また、商品が追加されていてない時は要素数で判定をし、カゴの中身が空である旨を返します。

def show_dic(self):
        print("NAME    | NUM | PRICE")
        if len(self.product_dic) == 0:
            print("カゴの中身は空です。")
        else:
            for name, product in self.product_dic.items():
                num = int(product.num)
                price = int(product.price)
                each_total_price = num * price
                print("{0:<8}| {1:<3} | {2}".format(name, num, each_total_price))

4-3.追加された商品の合計金額

for文で各商品オブジェクトの値段と数量を取り出し、カゴ内商品の合計金額を求めます。

  def show_total_price(self):
        total_price = 0
        for product in self.product_dic.values():
            num = int(product.num)
            price = int(product.price)
            each_total_price = num * price
            total_price += each_total_price
        print("TOTAL PRICE:{0}".format(total_price))

4-4.追加された商品の合計数

4-3と同様にfor文で各商品オブジェクトの数量を取り出し、カゴ内商品の合計数を求めます。

  total_num = 0
        for product in self.product_dic.values():
            num = int(product.num)
            total_num += num
        print("TOTAL NUM:{0}".format(total_num))

4-5.カゴの中の商品の削除

商品名を指定してカゴ内のオブジェクトを削除します。この時、カゴ内に該当の商品が存在しない場合、その旨をメッセージで出力します。

 def remove(self, product_name):
        try:
            delete_product = self.product_dic.pop(product_name)
            print("{0}を買い物カゴから削除しました。".format(delete_product.name))
        except KeyError as ke:
            print("指定の商品は存在しないか、既に削除されています。")

4-6.買い物カゴクラス(最終形)

#買い物カゴクラス
class Basket:
    product_dic = {}

    def add(self, product):
        self.product_dic[product.name] = product

    def show_dic(self):
        print("NAME    | NUM | PRICE")
        if len(self.product_dic) == 0:
            print("カゴの中身は空です。")
        else:
            for name, product in self.product_dic.items():
                num = int(product.num)
                price = int(product.price)
                each_total_price = num * price
                print("{0:<8}| {1:<3} | {2}".format(name, num, each_total_price))
    
    def show_total_price(self):
        total_price = 0
        for product in self.product_dic.values():
            num = int(product.num)
            price = int(product.price)
            each_total_price = num * price
            total_price += each_total_price
        print("TOTAL PRICE:{0}".format(total_price))

    def show_total_num(self):
        total_num = 0
        for product in self.product_dic.values():
            num = int(product.num)
            total_num += num
        print("TOTAL NUM:{0}".format(total_num))

    def remove(self, product_name):
        try:
            delete_product = self.product_dic.pop(product_name)
            print("{0}を買い物カゴから削除しました。".format(delete_product.name))
        except KeyError as ke:
            print("指定の商品は存在しないか、既に削除されています。")

5.買い物カゴの動作確認

実装できているか、どうか動作確認します。

#商品インスタンス
def instance_product():
    name = input("商品名を入力してください:")
    num = int(input("数量を入力してください:"))
    price = int(input("値段を入力してください:"))
    product  = Product()
    product.name = name
    product.num = num
    product.price = price
    return product

if __name__ == "__main__":

    basket = Basket()
    while 1:
        select_mode = int(input("1:カゴに入れる/2:一覧表示/3:合計金額/4:合計商品数/5:削除/0:買わない:"))
        #0.購入処理から抜ける
        if select_mode == 0: break
        #1.カゴに入れる
        if select_mode == 1:
            product = instance_product()
            basket.add(product)
        #2.一覧表示
        elif select_mode == 2:
            basket.show_dic()
        #3.合計金額
        elif select_mode == 3:
            basket.show_total_price()
        #4.合計商品数
        elif select_mode == 4:
            basket.show_total_num()
        #5.削除
        elif select_mode == 5:
            product_name = input("削除したい商品名を入力してください")
            basket.remove(product_name)

6. 買い物カゴ(最終形)

#買い物カゴクラス
class Basket:
    product_dic = {}

    def add(self, product):
        self.product_dic[product.name] = product

    def show_dic(self):
        print("NAME    | NUM | PRICE")
        if len(self.product_dic) == 0:
            print("カゴの中身は空です。")
        else:
            for name, product in self.product_dic.items():
                num = int(product.num)
                price = int(product.price)
                each_total_price = num * price
                print("{0:<8}| {1:<3} | {2}".format(name, num, each_total_price))
    
    def show_total_price(self):
        total_price = 0
        for product in self.product_dic.values():
            num = int(product.num)
            price = int(product.price)
            each_total_price = num * price
            total_price += each_total_price
        print("TOTAL PRICE:{0}".format(total_price))

    def show_total_num(self):
        total_num = 0
        for product in self.product_dic.values():
            num = int(product.num)
            total_num += num
        print("TOTAL NUM:{0}".format(total_num))

    def remove(self, product_name):
        try:
            delete_product = self.product_dic.pop(product_name)
            print("{0}を買い物カゴから削除しました。".format(delete_product.name))
        except KeyError as ke:
            print("指定の商品は存在しないか、既に削除されています。")
#商品クラス
class Product:
    name = ""
    price = 0
    num = 0

#商品インスタンス
def instance_product():
    name = input("商品名を入力してください:")
    num = int(input("数量を入力してください:"))
    price = int(input("値段を入力してください:"))
    product  = Product()
    product.name = name
    product.num = num
    product.price = price
    return product

if __name__ == "__main__":

    basket = Basket()
    while 1:
        select_mode = int(input("1:カゴに入れる/2:一覧表示/3:合計金額/4:合計商品数/5:削除/0:買わない:"))
        #0.購入処理から抜ける
        if select_mode == 0: break
        #1.カゴに入れる
        if select_mode == 1:
            product = instance_product()
            basket.add(product)
        #2.一覧表示
        elif select_mode == 2:
            basket.show_dic()
        #3.合計金額
        elif select_mode == 3:
            basket.show_total_price()
        #4.合計商品数
        elif select_mode == 4:
            basket.show_total_num()
        #5.削除
        elif select_mode == 5:
            product_name = input("削除したい商品名を入力してください")
            basket.remove(product_name)

7.実行結果




この記事が気に入ったらサポートをしてみませんか?