プログラミングにおいて、既存のクラス(設計図)の機能をそのまま引き継ぎつつ、新しい機能を追加したり、一部を変更したりして新しいクラスを作成する仕組みを**「継承(Inheritance)」**と呼びます。
継承を使用することで、共通のコードを何度も書く必要がなくなり、保守性が高く効率的なプログラムを作成できます。
この記事では、クラス継承の基本的な書き方と、親クラスの初期化メソッドを呼び出す super() 関数の役割について解説します。
継承の基本概念
- 親クラス(基底クラス / スーパークラス): 継承元となるクラス。基本的な機能を持たせます。
- 子クラス(派生クラス / サブクラス): 親クラスを継承して作る新しいクラス。親の機能を持ちつつ、独自の機能を追加します。
1. 親クラスの定義
まずは、継承元となる基本的なクラスを定義します。 ここでは、RPGゲームの「キャラクター」を表す GameCharacter クラスを作成します。名前と体力(HP)を持ち、攻撃する機能を備えています。
class GameCharacter:
"""
基本的なキャラクタークラス(親クラス)
"""
def __init__(self, name, hp):
self.name = name
self.hp = hp
def attack(self):
"""通常攻撃のメソッド"""
print(f"{self.name} の攻撃! 敵にダメージを与えました。")
def show_status(self):
"""ステータスを表示するメソッド"""
print(f"名前: {self.name} | HP: {self.hp}")
2. 子クラスの定義(継承)
次に、この GameCharacter を継承して、魔法使いを表す Wizard クラスを作成します。 継承するには、クラス名の後ろに (親クラス名) を記述します。
Wizard は、親クラスの機能に加えて、魔力(MP)という新しい属性と、魔法を唱えるという新しいメソッドを持ちます。
super() による親クラスの初期化
子クラスで独自の __init__(コンストラクタ)を定義する場合、親クラスの __init__ も明示的に呼び出して、親クラス側の属性(名前やHP)を適切に設定してもらう必要があります。
これを行うのが super().__init__(...) です。
class Wizard(GameCharacter):
"""
魔法使いクラス(GameCharacterを継承)
"""
def __init__(self, name, hp, mp):
# 親クラス(GameCharacter)の __init__ を呼び出して、name と hp を設定する
super().__init__(name, hp)
# Wizard 独自の属性 mp を設定
self.mp = mp
def cast_spell(self, spell_name):
"""Wizard独自のメソッド:魔法を唱える"""
print(f"{self.name} は {spell_name} を唱えた!")
self.mp -= 10
print(f"MPを消費しました。(残りMP: {self.mp})")
3. 継承したクラスの利用
作成した Wizard クラス(インスタンス)は、自分で定義した cast_spell メソッドだけでなく、親クラスから引き継いだ attack や show_status メソッドも使用できます。
# Wizardクラスのインスタンスを生成
# 名前, HP, MP を渡す
player_wizard = Wizard("Merlin", 100, 50)
print("--- ステータス確認 ---")
# 親クラスのメソッドを使用可能
player_wizard.show_status()
print(f"MP: {player_wizard.mp}") # 独自の属性にもアクセス可能
print("\n--- 行動開始 ---")
# 親クラスのメソッドを実行
player_wizard.attack()
# 子クラス独自のメソッドを実行
player_wizard.cast_spell("ファイアボール")
実行結果:
--- ステータス確認 ---
名前: Merlin | HP: 100
MP: 50
--- 行動開始 ---
Merlin の攻撃! 敵にダメージを与えました。
Merlin は ファイアボール を唱えた!
MPを消費しました。(残りMP: 40)
このように、Wizard クラスでは「名前」や「HP」、「攻撃メソッド」の定義コードを一切書いていないにもかかわらず、GameCharacter を継承しているため、それらをそのまま利用できています。
まとめ
- クラスを継承するには
class 子クラス(親クラス):と記述します。 - 子クラスは、親クラスのデータ(属性)と機能(メソッド)を引き継ぎます。
- 子クラスで
__init__を定義する場合は、super().__init__()を使って親クラスの初期化処理を呼び出すのが一般的です。 - 共通部分を親クラスにまとめ、差分だけを子クラスに記述することで、コードの重複を避けることができます。
