一覧へ

Pythonクラスと継承

Pythonクラスとは何か、なぜ使うのか、継承はどのように機能するのかを実践的な例を通して学びます。

中級
|
10
|
検証済み (2026-07)
クラス継承オブジェクト指向OOPselfメソッド
進捗0/18 (0%)

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()) # B
s2.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__()で親のコンストラクタを呼び出します。
  • 子クラスで同じ名前のメソッドを定義すると、**オーバーライド(再定義)**されます。
  • departmentPersonに定義されていますが、StudentProfessorの両方で使用できます。

重要なまとめ

概念意味
クラスデータ(属性)+機能(メソッド)をまとめる設計図
インスタンス設計図から作成された実際のオブジェクト(s1 = Student(...)
__init__コンストラクタ — インスタンスを作成するときに自動的に実行
self現在のインスタンス自身を指す
継承親クラスの属性/メソッドを子クラスが受け継ぐ
super()親クラスのメソッドを呼び出す
オーバーライド子クラスが親のメソッドを再定義する

クラスを「必ず使う必要がある」というルールはありません。小さなスクリプトでは、関数と辞書で十分です。しかし、コードが大きくなり、同じ構造のデータを複数扱う場合、クラスはコードを整理するための最も実績のあるツールです。


💬 質問・コメント

0件のコメント

ログインせずに投稿できます。ゲスト投稿は投稿者自身で編集・削除できません。

0/2000

読み込み中...