【Python OOP入門】ToDoアプリをクラスで改造!オブジェクト指向の考え方 更新日: 2026年1月27日 私がまだ「クラス」という概念を知らなかった頃、PythonでRPGゲームを作ろうとしたことがあります。 主人公のステータス、敵のステータス、アイテム...全てを別々の変数で管理しようとしました。 hero_hp = 100, hero_mp = 50, enemy1_hp = 50... 敵が3体、5体と増えるにつれ、変数の数は数百個に膨れ上がり、どの変数が誰のものなのか分からなくなって、開発は完全に破綻しました。 その時、先輩エンジニアに教えてもらったのが「オブジェクト指向(OOP)」でした。 「主人公も敵も、『キャラクター』という設計図から作ればいいんだよ」と言われた時、目の前の霧が晴れたような衝撃を受けました。 今日は、おなじみのToDoアプリを「クラス」を使って改造する過程を通して、オブジェクト指向がなぜこれほどまでに強力で、大規模開発に必須なのかを解説します。 🚗 クラスとは? オブジェクトとは? 非常に簡単に言うと、クラスとは「モノの設計図」です。 例えば、「自動車」というクラス(設計図)には、「色」「速度」といったデータ(属性)と、「走る」「止まる」といった機能(メソッド)が定義されています。 そして、その設計図を元に作られた実体が「オブジェクト」です。 「赤いフェラーリ」や「青いプリウス」は、どちらも「自動車」クラスから作られた、それぞれが独立したオブジェクトなのです。 💡 なぜクラスを使うのか? 関連するデータと機能を一つの「モノ」としてまとめる(これをカプセル化と言います)ことで、コードの整理がしやすくなり、まるでレゴブロックを組み合わせるように、直感的にプログラムを組み立てられるようになります。 🛠️ ToDoアプリをクラスベースにリファクタリング それでは、この考え方をToDoアプリに応用してみましょう。 今回は2つのクラスを作ります。 Taskクラス:一つ一つのタスクを表現するための設計図。 TodoListクラス:タスクのリスト全体を管理するための設計図。 1. Taskクラスの設計 まず、個々のタスクが持つべきデータ(属性)を考えます。今回はシンプルに「タスクの内容(文字列)」だけを持たせましょう。 class Task: def __init__(self, content): self.content = content def __str__(self): return self.content class Task:: これでTaskという名前のクラスの設計を開始します。 def __init__(self, content):: これはコンストラクタと呼ばれる特殊なメソッドです。Taskオブジェクトが作られる(インスタンス化される)時に、最初に一度だけ呼ばれます。 self.content = content: 受け取ったcontent(タスク内容)を、そのオブジェクト自身のデータ(属性)として保存しています。selfはそのオブジェクト自身を指す特別な変数です。 2. TodoListクラスの設計 次に、Taskオブジェクトのリストを管理するためのクラスを作ります。以前、関数としてバラバラに定義していた機能を、このクラスのメソッドとしてまとめ上げます。 import json FILENAME = "todos.json" class TodoList: def __init__(self): self.tasks = self.load_todos() def load_todos(self): try: with open(FILENAME, "r", encoding="utf-8") as f: # JSONから読み込んだただの文字列を、Taskオブジェクトに変換する contents = json.load(f) return [Task(content) for content in contents] except FileNotFoundError: return [] def save_todos(self): with open(FILENAME, "w", encoding="utf-8") as f: # Taskオブジェクトのリストを、ただの文字列のリストに変換して保存 contents = [task.content for task in self.tasks] json.dump(contents, f, ensure_ascii=False, indent=2) def add_task(self): content = input("追加するタスクを入力してください: ") task = Task(content) # 新しいTaskオブジェクトを作成 self.tasks.append(task) self.save_todos() print("タスクを追加しました。") def list_tasks(self): print("--- ToDoリスト ---") for i, task in enumerate(self.tasks, start=1): print(f"{i}: {task}") # __str__メソッドが呼ばれる print("------------------") # (complete_taskメソッドも同様にクラス内に移動) 3. メイン処理の劇的な変化 クラスの設計が完了すると、メインのwhileループは驚くほどシンプルで直感的になります。 # --- メイン処理 --- def main(): todo_list = TodoList() # TodoListオブジェクトを一つ作成 print("オブジェクト指向ToDoリストアプリ") while True: command = input("コマンドを選択してください (add, list, done, exit): ") if command == "add": todo_list.add_task() elif command == "list": todo_list.list_tasks() elif command == "done": todo_list.complete_task() elif command == "exit": print("アプリを終了します。") break else: print("無効なコマンドです。") if __name__ == "__main__": main() todo_list.add_task() のように、「ToDoリスト(オブジェクト)に、タスクを追加する(メソッドを呼び出す)」という、「主語.動詞()」の形で、まるで自然言語のようにコードが読めるようになりました。 私が初めてこれを書いた時、「プログラムと会話しているみたいだ!」と感動したのを覚えています。これこそがオブジェクト指向の力です! まとめ 今回は、ToDoアプリを「クラス」ベースにリファクタリングすることで、オブジェクト指向プログラミングの第一歩を踏み出しました。 class で、データとそれを操作する機能をまとめた「設計図」を作る。 設計図から オブジェクト という「実体」を作り、操作する。 RPG制作で挫折した私のような失敗をしないためにも、ぜひこの「設計図からモノを作る」考え方をマスターしてください。 どんなに複雑なゲームやアプリも、この基本の積み重ねで作られているのですから。 プログラミング学習に必須ツール! 記事で紹介したコードがよく分からなかったり、ご自身のコードについてもっと知りたい場合は、AIコード解説ツールが便利です。コードを貼り付けるだけで、AIが日本語で分かりやすく解説します。 AIコード解説ツールを使ってみる →