ここまでで、クラスの基礎から継承・多態性まで学びました。
今回はその知識を使って、実践的な小さなアプリを作ってみましょう。
🎯 今回作るアプリ
「シンプルな家計簿アプリ」をオブジェクト指向で設計します。
Transaction(取引)クラス:1件の収入や支出を表すLedger(帳簿)クラス:複数の取引を管理する- クラス同士の関係・再利用性を体感できるように構成します。
🧱 Step 1. 取引クラス(Transaction)を作る
まずは1件の収入・支出データを扱うクラスです。
class Transaction:
def __init__(self, date, category, amount):
self.date = date
self.category = category
self.amount = amount # 正の数なら収入、負の数なら支出
def __str__(self):
type_str = "収入" if self.amount > 0 else "支出"
return f"[{self.date}] {self.category} : {type_str} {abs(self.amount)}円"
動作確認
t1 = Transaction("2025-10-01", "給料", 300000)
t2 = Transaction("2025-10-02", "食費", -2500)
print(t1)
print(t2)
出力:
[2025-10-01] 給料 : 収入 300000円
[2025-10-02] 食費 : 支出 2500円
💡
__str__()を定義すると、print()時に見やすい文字列で出力できます。
📘 Step 2. 帳簿クラス(Ledger)を作る
次に、取引をまとめて管理するクラスを作ります。
class Ledger:
def __init__(self):
self.transactions = []
def add_transaction(self, transaction):
self.transactions.append(transaction)
def show_all(self):
for t in self.transactions:
print(t)
def total_balance(self):
total = sum(t.amount for t in self.transactions)
return total
実行例
ledger = Ledger()
ledger.add_transaction(Transaction("2025-10-01", "給料", 300000))
ledger.add_transaction(Transaction("2025-10-02", "食費", -2500))
ledger.add_transaction(Transaction("2025-10-03", "交通費", -1200))
ledger.show_all()
print("現在の残高:", ledger.total_balance(), "円")
出力:
[2025-10-01] 給料 : 収入 300000円
[2025-10-02] 食費 : 支出 2500円
[2025-10-03] 交通費 : 支出 1200円
現在の残高: 296300 円
💡
sum()でリスト内包表記を使えば、クラスの中でも簡潔に合計が取れます。
🧩 Step 3. 継承を使って「カテゴリー別管理」を追加
次に、継承を利用してより特化した家計簿を作ります。
class CategoryLedger(Ledger):
def show_by_category(self, category):
print(f"▼ {category} の取引一覧 ▼")
for t in self.transactions:
if t.category == category:
print(t)
実行例
ledger = CategoryLedger()
ledger.add_transaction(Transaction("2025-10-01", "給料", 300000))
ledger.add_transaction(Transaction("2025-10-02", "食費", -2500))
ledger.add_transaction(Transaction("2025-10-03", "交通費", -1200))
ledger.add_transaction(Transaction("2025-10-04", "食費", -1800))
ledger.show_by_category("食費")
出力:
▼ 食費 の取引一覧 ▼
[2025-10-02] 食費 : 支出 2500円
[2025-10-04] 食費 : 支出 1800円
💡
Ledgerを継承してshow_by_category()を追加。
再利用性が高く、保守も簡単です。
⚙️ Step 4. ポリモーフィズムで「CSV出力対応」クラスを追加
家計簿をファイル出力するクラスを、Ledger の仕組みを活かして作ってみましょう。
import csv
class CsvLedger(Ledger):
def export_csv(self, filename):
with open(filename, "w", newline="", encoding="utf-8") as f:
writer = csv.writer(f)
writer.writerow(["日付", "カテゴリ", "金額"])
for t in self.transactions:
writer.writerow([t.date, t.category, t.amount])
print(f"{filename} に出力しました。")
実行例
ledger = CsvLedger()
ledger.add_transaction(Transaction("2025-10-01", "給料", 300000))
ledger.add_transaction(Transaction("2025-10-02", "食費", -2500))
ledger.export_csv("ledger.csv")
出力:
ledger.csv に出力しました。
💡
CsvLedgerはLedgerを継承しつつ、
独自のメソッドexport_csv()を追加しています。
これもポリモーフィズムの一種です。
🧠 学んだことまとめ
| 概念 | 内容 |
|---|---|
| クラスの活用 | データ(属性)と動作(メソッド)を一体化して管理できる |
| 継承の再利用性 | 基本機能を受け継ぎながら新機能を追加できる |
| ポリモーフィズム | 同じインターフェースで異なる動作を実現できる |
| オブジェクト指向の設計力 | 小規模アプリでも整理された構造を作れる |
🎯 まとめ
- ✅ クラスを使うことで、現実の「モノや仕組み」を自然にコード化できる
- ✅ 継承を使うことで、重複せず拡張できる
- ✅ ポリモーフィズムで柔軟な拡張が可能
- ✅ 実践アプリ(家計簿)で、全体の流れを体感できた!


コメント