Python | 1 日 120 分 × 7 日アプリ学習:クラスで作る商品管理アプリ(中級編)

Web APP Python
スポンサーリンク

2日目のゴール

2日目のテーマは
「クラスで作った商品オブジェクトを“複数”扱い、一覧表示や検索の土台を作ること」です。

1日目では、Product クラスという「商品という型」を作り、
その実物(オブジェクト)を一つだけ作って表示しました。

2日目では、ここから一歩進んで、

複数の商品オブジェクトをリストで管理する
商品を追加する処理を関数として整理する
商品一覧を表示する処理を作る
オブジェクトの集まりをどう扱うか、という感覚をつかむ

ここを目指します。


おさらい Product クラスの基本形

商品という「型」をもう一度確認する

まずは、1日目に作った Product クラスをもう一度見ておきます。

class Product:
    def __init__(self, product_id, name, price, stock):
        self.product_id = product_id
        self.name = name
        self.price = price
        self.stock = stock

    def show_info(self):
        print("=== 商品情報 ===")
        print(f"ID: {self.product_id}")
        print(f"名前: {self.name}")
        print(f"価格: {self.price} 円")
        print(f"在庫数: {self.stock}")
Python

ここで大事なのは、次の二つです。

一つ目は、__init__ が「商品オブジェクトが生まれた瞬間に、ID・名前・価格・在庫数をセットしている」ということ。
二つ目は、show_info が「この商品自身の情報を表示するメソッド」になっていること。

つまり、Product クラスは
「商品というものが持つべき情報」と
「商品に関する基本的な振る舞い」を
ひとまとめにした「型」になっています。


複数の商品オブジェクトをリストで管理する

「商品一覧」という視点を持つ

商品が一つだけなら、変数一つで十分です。

p1 = Product("p001", "ノートPC", 120000, 5)
Python

でも、商品管理アプリを作るなら、
当然「複数の商品」を扱いたくなります。

ここで登場するのが「リスト」です。

products = []

p1 = Product("p001", "ノートPC", 120000, 5)
p2 = Product("p002", "マウス", 1500, 30)
p3 = Product("p003", "キーボード", 3000, 20)

products.append(p1)
products.append(p2)
products.append(p3)
Python

この時点で、products は
「Product オブジェクトが並んだリスト」になっています。

イメージとしては、

products[0] が p1(ノートPC)
products[1] が p2(マウス)
products[2] が p3(キーボード)

という感じです。

ここで重要なのは、
「辞書のときはキーで管理していたが、
クラスの場合は“オブジェクトのリスト”として持つことも多い」
という感覚です。


商品一覧を表示する関数を作る

オブジェクトのリストをぐるっと回す

products に複数の商品オブジェクトが入っているなら、
それを一覧表示する関数を作れます。

def show_all_products(products):
    print("=== 商品一覧 ===")

    if not products:
        print("商品がまだ登録されていません。")
        return

    for product in products:
        product.show_info()
        print("----------")
Python

ここで深掘りしたいポイントは三つあります。

一つ目は、if not products: で「リストが空かどうか」をチェックしていること。
二つ目は、for product in products: で「Product オブジェクトを一つずつ取り出している」こと。
三つ目は、product.show_info() と書くことで「その商品自身に表示させている」こと。

特に三つ目が大事です。

「表示の仕方」を Product クラスの中に閉じ込めておくことで、
一覧表示側のコードは「product.show_info()」と呼ぶだけで済みます。

もし表示形式を変えたくなったら、
Product クラスの show_info だけを直せば、
アプリ全体の表示が変わります。


商品を追加する処理を関数にする

入力 → Product を作る → リストに追加、という流れ

次に、「商品を一つ登録する」処理を関数にします。

def add_product(products):
    print("=== 商品登録 ===")
    product_id = input("商品ID: ").strip()
    name = input("商品名: ").strip()
    price_text = input("価格(整数): ").strip()
    stock_text = input("在庫数(整数): ").strip()

    if not price_text.isdigit() or not stock_text.isdigit():
        print("価格と在庫数は数字で入力してください。")
        return

    price = int(price_text)
    stock = int(stock_text)

    product = Product(product_id, name, price, stock)
    products.append(product)

    print("商品を登録しました。")
Python

ここでの重要ポイントは、流れをきちんと分解して理解することです。

まず、ユーザーから商品ID・名前・価格・在庫数を入力してもらう。
次に、価格と在庫数が数字かどうかをチェックし、整数に変換する。
その情報を使って Product オブジェクトを一つ作る。
最後に、そのオブジェクトを products リストに追加する。

つまり、

「入力された情報 → Product オブジェクト → products リスト」

という流れができています。


メニューで「登録」と「一覧」を選べるようにする

2日目版のシンプルなメインループ

ここまで作った add_product と show_all_products を
メニューから呼べるようにします。

def show_menu():
    print("==========")
    print("商品管理アプリ(クラス編 2日目)")
    print("1: 商品を登録する")
    print("2: 商品一覧を表示する")
    print("0: 終了")
    print("==========")


def main():
    products = []

    while True:
        show_menu()
        choice = input("番号を選んでください: ").strip()

        if choice == "1":
            add_product(products)
        elif choice == "2":
            show_all_products(products)
        elif choice == "0":
            print("アプリを終了します。")
            break
        else:
            print("不正な入力です。0, 1, 2 のどれかを選んでください。")
Python

この main の役割を日本語で説明すると、こうなります。

最初に空の products リストを用意する。
メニューを表示し、ユーザーに操作を選んでもらう。
1 が選ばれたら add_product を呼んで商品を追加する。
2 が選ばれたら show_all_products を呼んで一覧表示する。
0 が選ばれたら終了する。

ここで大事なのは、
「products という“商品一覧”を main が持ち、
各機能にそれを渡している」という構造です。


2日目の完成コードをまとめて見る

クラス+リスト+メニューの最初の形

ここまでのコードを一つにまとめると、こうなります。

class Product:
    def __init__(self, product_id, name, price, stock):
        self.product_id = product_id
        self.name = name
        self.price = price
        self.stock = stock

    def show_info(self):
        print("=== 商品情報 ===")
        print(f"ID: {self.product_id}")
        print(f"名前: {self.name}")
        print(f"価格: {self.price} 円")
        print(f"在庫数: {self.stock}")


def add_product(products):
    print("=== 商品登録 ===")
    product_id = input("商品ID: ").strip()
    name = input("商品名: ").strip()
    price_text = input("価格(整数): ").strip()
    stock_text = input("在庫数(整数): ").strip()

    if not price_text.isdigit() or not stock_text.isdigit():
        print("価格と在庫数は数字で入力してください。")
        return

    price = int(price_text)
    stock = int(stock_text)

    product = Product(product_id, name, price, stock)
    products.append(product)

    print("商品を登録しました。")


def show_all_products(products):
    print("=== 商品一覧 ===")

    if not products:
        print("商品がまだ登録されていません。")
        return

    for product in products:
        product.show_info()
        print("----------")


def show_menu():
    print("==========")
    print("商品管理アプリ(クラス編 2日目)")
    print("1: 商品を登録する")
    print("2: 商品一覧を表示する")
    print("0: 終了")
    print("==========")


def main():
    products = []

    while True:
        show_menu()
        choice = input("番号を選んでください: ").strip()

        if choice == "1":
            add_product(products)
        elif choice == "2":
            show_all_products(products)
        elif choice == "0":
            print("アプリを終了します。")
            break
        else:
            print("不正な入力です。0, 1, 2 のどれかを選んでください。")


main()
Python

この時点で、すでに
「クラスで作った商品オブジェクトを、リストで管理し、
メニューから登録と一覧表示ができるアプリ」
になっています。


辞書での管理との違いを意識してみる

「データだけ」か「データ+振る舞い」か

ユーザー管理アプリでは、
ユーザー情報を辞書で管理していました。

今回の商品管理アプリでは、
商品をクラス(Product)として定義し、
そのオブジェクトをリストで管理しています。

この違いを一言で言うと、

辞書版は「データだけを持っていて、処理は外側に書く」。
クラス版は「データと処理をひとまとめにして、オブジェクトとして扱う」。

ということです。

例えば、在庫を減らす処理を考えると、
辞書版なら「在庫を減らす関数」に辞書を渡していましたが、
クラス版なら「product.reduce_stock(3)」のように
「商品自身にやってもらう」書き方ができます。

この「自分のデータは自分のメソッドで扱う」というスタイルが、
クラスとオブジェクトの大きな魅力です。


2日目のまとめ 今日つかんでほしい感覚

今日の本質は、こういう感覚です。

Product クラスは「商品という型」であり、オブジェクトはその実物。
複数の商品は「Product オブジェクトのリスト」として管理できる。
商品を追加する流れは「入力 → Product を作る → リストに追加」。
一覧表示は「リストをループしながら、各オブジェクトのメソッドを呼ぶ」。
クラスを使うと、「データ」と「そのデータに関する処理」をひとまとめにできる。

3日目からは、
この products リストに対して「検索」「更新」「削除」を足していきます。

辞書でやった CRUD を、
今度は「クラスとオブジェクト」でどう表現するか。
そこに入っていくための土台が、今日の内容です。

タイトルとURLをコピーしました