Pythonのクラスを使って在庫管理の仕組みを作ります。
今回はクラスへの理解を深めていくことが第一目的なので、仕組みの部分のみを実装します。
(実際に作るとなった場合は、データベースとなる箱に接続する必要があります。)
クラス?インスタンス?
クラスとインスタンスの違いが曖昧な方向けに、簡単に違いを確認します。
クラスとは設計図のイメージです。基本的に変数とメソッドを組み合わせて作成します。
一方、インスタンスとはクラスを使って実際に作った物を言います。
図で表すとこんな感じです。
クラスについてもう少し詳しく知りたい方はこちらの動画を活用ください。
在庫管理を可視化する
次に、コードを書く前に必要な情報と機能を可視化します。
今回は簡潔に以下の情報を考えることにします。
ここで言う属性とは、商品名・個数・価格のことを指します。
次に機能の方を考えます。
在庫管理に必要な機能として主に、
- 新規登録
- 蓄積されたデータの読み込み
- データの編集
- データの削除
の4つがあげられます。この処理を表す言葉にCRUD(クラッド)と呼ばれるものがあり、create、read、update、deleteの頭文字をとった言葉となっています。
これを踏まえた上で、今回は以下の機能を考えることにします。
他にも価格の変更や、名前以外の条件検索等が必要になってくるかと思いますが、とりあえず今回はこの辺にしておきます。
Productクラスを実装する
先ほどの画像をもとにProductクラスを実装します。
class Product:
def __init__(self, name, quantity, price):
self.name = name
self.quantity = quantity
self.price = price
def show(self):
print(f'商品: {self.name}\n個数: {self.quantity}\n価格: {self.price}')
def __init__(self, name, quantity, price) はインスタンス化をするときに実行される関数になります。インスタンス化には、商品名・個数・価格を必要とします。
def show(self) で生成したインスタンスを確認することができます。
# インスタンス化して、変数pに代入
p = Product("apple", 12, 100)
# 生成したインスタンスを確認
p.show()
商品: apple
個数: 12
価格: 100
self.nameにapple、self.quantityに12、self.priceに100が代入されていることが分かります。
Stockクラスを実装するまえに
Stockクラスを実装する前に、次のStockクラスでよく出てくるfor-elseの構文について確認をします。
確認が必要ない方はここは飛ばしてください。
ループ文はelse節を持つことができます。for文では反復させる要素を使い切ったとき、while文では条件が偽になったときに実行されます。
以下が実行例です。
for i in range(1, 6):
print(i, end = ",")
else:
print("\nelse節が実行されました")
1,2,3,4,5,
else節が実行されました
continue有り
for i in range(1, 6):
if i == 3:
continue
print(i, end = ",")
else:
print("\nelse節が実行されました")
1,2,4,5,
else節が実行されました
break有り
for i in range(1, 6):
if i == 3:
break
print(i, end = ",")
else:
print("\nelse節が実行されました")
1,2,
breakは途中でループ処理を抜けるため、else節が実行されません。
continueとbreakについて確認したい方はこちらの記事をどうぞ
Stockクラスを実装する
続いてStockクラスを実装します。全体のコードおよび動作確認は次の章に載せます。
ここではStockクラスの各メソッドを1つ1つ紹介します。
__init__(初期設定関数)
class Stock:
def __init__(self):
self.stocks = []
先ほども言いましたが、def __init__(self) はインスタンスを生成したときに実行されます。今回はstocks
を属性として、商品を格納するリストを作成します。
属性とは、モジュール名.関数名などといった、ドットに続く名前のことを言います。
add_product(在庫を登録する関数)
def add_product(self, product):
# 空の場合
if not self.stocks:
self.stocks.append(product)
print(f"{product.name}を{product.quantity}個在庫に追加しました!")
# 空でない場合は既に存在しないか調べる
else:
for stock in self.stocks:
if stock.name == product.name:
print("既に存在します。更新の機能を使ってください。")
break
else:
self.stocks.append(product)
print(f"{product.name}を{product.quantity}個在庫に追加しました。")
引数として、先ほど作成したProductクラスのインスタンスを受け取ります。
リストが空の場合は無条件に在庫を登録します。空でない場合は在庫が既に登録されていないか調べ、ある場合は登録をしないようにしています。登録にはリストのメソッドであるappendメソッドを使用します。
リストのメソッドに関して
list.append(x) は末尾にアイテムを1つ追加するメソッドになります。
メソッドとは
メソッドとはオブジェクトに属している関数のことで、objを何らかのオブジェクト、methodをそのオブジェクトで定義されているメソッドとすると、 obj.methodと書き表されます。
その他のメソッドに関しては
- list.pop(i):指定された位置のアイテムをリストから削除し、このアイテムを返す
- list.clear():リストから全てのアイテムを削除する
- list.count(x):リストのxの個数を返す
- list.index(x, start, end):xに等しい最初のアイテムのインデックスを返す。※endは含まない
- list.sort(key=None, reverse=False):リストをソートする
- list.extend(iterable):末尾にイテラブルを追加する
- list.reverse():リストを逆順にする
- list.remove(x):xに等しい最初のアイテムを削除する
- list.copy():リストのコピーを返す
- list.insert(i, x):指定された位置にアイテムを挿入する
があります。
さらに詳しく知りたい方は公式ドキュメントをご確認ください。
get_product(特定の在庫を取得する)
def get_product(self, product_name):
for stock in self.stocks:
if stock.name == product_name:
print(f'商品: {product_name}\n個数: {stock.quantity}\n価格: {stock.price}')
break
else:
print(f"{product_name}は存在しません。")
引数に製品の名前を指定します。指定した製品が在庫にあった場合、その在庫を表示します。
display_stock(在庫をすべて取得する)
def display_stock(self):
if not self.stocks:
print("何も存在しません。")
else:
print("現在の在庫状況:")
for stock in self.stocks:
print(f'商品:{stock.name}\t個数:{stock.quantity}\t価格:{stock.price}')
現在登録されている在庫をfor文を使ってすべて表示します。在庫がない場合は"何も存在しません。"と出力します。
update_quatity(在庫の個数を更新する)
def update_quantity(self, product_name, new_quantity):
for stock in self.stocks:
if stock.name == product_name:
stock.quantity = new_quantity
print(f"{product_name}の在庫数を{new_quantity}個に変更しました。")
break
else:
print(f"{product_name}は存在しません。")
引数に製品の名前と新しい個数を指定します。個数の属性であるquantity
にnew_quantityを代入し、在庫数を更新します。
delete_product(在庫を削除する)
def delete_product(self, product_name):
for stock in self.stocks:
if stock.name == product_name:
self.stocks.remove(stock)
print(f"{product_name}を削除しました。")
break
else:
print(f"{product_name}は存在しません。")
在庫を削除します。リストのメソッドであるremoveメソッドを使用します。
プログラム全体および動作を確認する
コード全体は以下のようになります。
class Product:
def __init__(self, name, quantity, price):
self.name = name
self.quantity = quantity
self.price = price
def show(self):
print(f'商品: {self.name}\n個数: {self.quantity}\n価格: {self.price}')
class Stock:
def __init__(self):
self.stocks = []
def add_product(self, product):
# 空の場合
if not self.stocks:
self.stocks.append(product)
print(f"{product.name}を{product.quantity}個在庫に追加しました!")
# 空じゃない場合既に存在しないか調べる
else:
for stock in self.stocks:
if stock.name == product.name:
print("既に存在します。更新の機能を使ってください。")
break
else:
self.stocks.append(product)
print(f"{product.name}を{product.quantity}個在庫に追加しました。")
def get_product(self, product_name):
for stock in self.stocks:
if stock.name == product_name:
print(f'商品: {product_name}\n個数: {stock.quantity}\n価格: {stock.price}')
break
else:
print(f"{product_name}は存在しません。")
def display_stock(self):
if not self.stocks:
print("何も存在しません。")
else:
print("現在の在庫状況:")
for stock in self.stocks:
print(f'商品:{stock.name}\t個数:{stock.quantity}\t価格:{stock.price}')
def update_quantity(self, product_name, new_quantity):
for stock in self.stocks:
if stock.name == product_name:
stock.quantity = new_quantity
print(f"{product_name}の在庫数を{new_quantity}個に変更しました。")
break
else:
print(f"{product_name}は存在しません。")
def delete_product(self, product_name):
for stock in self.stocks:
if stock.name == product_name:
self.stocks.remove(stock)
print(f"{product_name}を削除しました。")
break
else:
print(f"{product_name}は存在しません。")
各メソッドの出力結果を確認する
Stockクラスの各メソッドの動作を確認していきます。
__init__
# インスタンスを生成し、変数sに代入
s = Stock()
add_product
リストが空の場合
s.add_product(Product("apple", 12, 100))
appleを12個在庫に追加しました!
リストに登録がない場合
s.add_product(Product("lemon", 18, 120))
lemonを18個在庫に追加しました。
リストに登録がある場合
s.add_product(Product("lemon", 8, 120))
既に存在します。更新の機能を使ってください。
get_product
在庫がある場合
s.get_product("lemon")
商品: lemon
個数: 18
価格: 120
在庫がない場合
s.get_product("orange")
orangeは存在しません。
display_stock
在庫がある場合
s.display_stock()
現在の在庫状況:
商品:apple 個数:12 価格:100
商品:lemon 個数:18 価格:120
在庫がない場合
s.display_stock()
何も存在しません。
update_quantity
在庫がある場合
s.update_quantity("apple", 50)
appleの在庫数を50個に変更しました。
在庫がない場合
s.update_quantity("orange", 50)
orangeは存在しません。
delete_product
在庫がある場合
s.delete_product("apple")
appleを削除しました。
もう一度実行すると(在庫がない場合)
s.delete_product("apple")
appleは存在しません。
おわりに
今回は簡単ではありましたが、クラスを使って在庫管理の仕組みを作ってみました。
初学者の方にとってクラスは少々難しい部分ではあるかと思いますが、参考になる部分があれば幸いです。
YouTubeにてPythonチュートリアル(公式ドキュメント)を使って基礎を解説しています。
基礎を学びたい方は是非ご活用ください。
あわせて読みたい