Pythonのクラス継承:親クラスの機能を拡張するsuper()関数の使い方

プログラミングにおいて、既存のクラス(設計図)の機能をそのまま引き継ぎつつ、新しい機能を追加したり、一部を変更したりして新しいクラスを作成する仕組みを**「継承(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 メソッドだけでなく、親クラスから引き継いだ attackshow_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__() を使って親クラスの初期化処理を呼び出すのが一般的です。
  • 共通部分を親クラスにまとめ、差分だけを子クラスに記述することで、コードの重複を避けることができます。
よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次