Python のクラスと継承
このトピックを修了すると
クラスとは何か、なぜ必要なのかを理解し、クラスを定義してオブジェクトを作成し、継承を使ってコードを再利用する方法を習得します。
クラスが必要になる瞬間
学生のデータを管理するとしましょう。辞書でも可能です。
python
student1 = {"name": "キム・フン", "score": 90}student2 = {"name": "イ・ス", "score": 85}
def get_grade(student): if student["score"] >= 90: return "A" elif student["score"] >= 80: return "B" return "C"問題は、規模が大きくなるときです。学生に「出欠確認」、「点数の修正」、「科目の追加」などの機能が追加されると、関数が分散し、「学生関連のコードはどこにあるのか?」を毎回探すことになります。
クラスは、データ(属性)と機能(メソッド)をまとめて扱います。
クラスの定義とインスタンスの作成
python
class Student: def __init__(self, name, score): self.name = name # インスタンス属性 self.score = score def grade(self): if self.score >= 90: return "A" elif self.score >= 80: return "B" return "C" def introduce(self): return f"{self.name} ({self.grade()}등급)"python
# インスタンスの作成s1 = Student("キム・フン", 90)s2 = Student("イ・ス", 85)
print(s1.introduce()) # キム・フン (A등급)print(s2.grade()) # Bs2.score = 92 # 点数の修正print(s2.grade()) # A__init__はコンストラクタです。インスタンスが作成されるときに自動的に呼び出されます。selfは自分自身です。このインスタンスの属性にアクセスするための経路です。Student("キム・フン", 90)が呼び出されると、__init__(self, "キム・フン", 90)が実行されます。
なぜクラスを使うのか
同じ機能を関数と辞書でも実装できます。クラスの真の価値は、「このデータでできること」をまとめておく点です。
python
# 関数方式 — データと機能が分離student = {"name": "キム・フン", "scores": []}add_score(student, 90)get_average(student)get_grade(student)
# クラス方式 — データと機能が一つstudent = Student("キム・フン")student.add_score(90)student.average()student.grade()student.と入力すると、IDEが「このオブジェクトでできること」のリストを表示します。コード自体がドキュメントの役割を果たします。
継承 — 共通のコードを受け継ぐ
「学生」と「教授」はどちらも「名前」と「所属」があります。共通の部分を親クラスに入れ、違いだけを子クラスで追加します。
python
class Person: def __init__(self, name, department): self.name = name self.department = department def introduce(self): return f"{self.name} ({self.department})"
class Student(Person): def __init__(self, name, department, student_id): super().__init__(name, department) # 親のコンストラクタを呼び出す self.student_id = student_id def introduce(self): return f"学生 {self.name} ({self.student_id})"
class Professor(Person): def __init__(self, name, department, lab): super().__init__(name, department) self.lab = lab def introduce(self): return f"教授 {self.name} ({self.lab} 研究室)"python
s = Student("キム・フン", "生命科学", "2024-001")p = Professor("パク・ジン", "生命科学", "遺伝子学")
print(s.introduce()) # 学生 キム・フン (2024-001)print(p.introduce()) # 教授 パク・ジン (遺伝子学 研究室)print(s.department) # 生命科学 — Personから継承された属性super().__init__()で親のコンストラクタを呼び出します。- 子クラスで同じ名前のメソッドを定義すると、**オーバーライド(再定義)**されます。
departmentはPersonに定義されていますが、StudentとProfessorの両方で使用できます。
重要なまとめ
| 概念 | 意味 |
|---|---|
| クラス | データ(属性)+機能(メソッド)をまとめる設計図 |
| インスタンス | 設計図から作成された実際のオブジェクト(s1 = Student(...)) |
__init__ | コンストラクタ — インスタンスを作成するときに自動的に実行 |
self | 現在のインスタンス自身を指す |
| 継承 | 親クラスの属性/メソッドを子クラスが受け継ぐ |
super() | 親クラスのメソッドを呼び出す |
| オーバーライド | 子クラスが親のメソッドを再定義する |
クラスを「必ず使う必要がある」というルールはありません。小さなスクリプトでは、関数と辞書で十分です。しかし、コードが大きくなり、同じ構造のデータを複数扱う場合、クラスはコードを整理するための最も実績のあるツールです。