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 を、
今度は「クラスとオブジェクト」でどう表現するか。
そこに入っていくための土台が、今日の内容です。


