継承と多態性

super()の使い方

メソッドのオーバーライドについて学んだところで、今度は「super()」という特別な関数についてお話しするね。

super()は、子クラスでメソッドをオーバーライドするときに、親クラスの同じメソッドを呼び出したいときに使うんだ。これを使うと、親クラスの機能も生かしつつ、子クラスで新しい機能を追加できるから、とっても便利なんだよ。

例えば、ゲームのキャラクターで考えてみよう。基本的なキャラクターは「挨拶」する機能を持っているけど、特別なキャラクターは挨拶に加えて「特別なメッセージ」も言いたい、なんてときに使えるよ。


# 親クラス:BaseCharacter(基本的なキャラクター)
class BaseCharacter:
    def __init__(self, name):
        self.name = name

    def greet(self):
        print(f"こんにちは!私は{self.name}です。")

# 子クラス:HeroCharacter(勇者のキャラクター)
class HeroCharacter(BaseCharacter):
    def __init__(self, name, weapon):
        # super()を使って親クラスの__init__を呼び出すよ!
        super().__init__(name)
        self.weapon = weapon

    # greetメソッドをオーバーライドするけど、親のgreetも使いたいな
    def greet(self):
        super().greet() # 親クラスのgreetメソッドを呼び出す!
        print(f"そして、私の武器は{self.weapon}です!")

hero = HeroCharacter("アキラ", "聖剣")
hero.greet()
# 出力:
# こんにちは!私はアキラです。
# そして、私の武器は聖剣です!

super().__init__(name)と書くことで、HeroCharacterが作られるときに、BaseCharacterの__init__メソッドも動いて、キャラクターの名前がちゃんと設定されるんだ。

そして、super().greet()と書くことで、HeroCharacterのgreetメソッドの中で、BaseCharacterのgreetメソッドが呼び出され、その後にHeroCharacter独自のメッセージが追加されているのが分かるかな?

super()を使うと、親クラスと子クラスの機能をうまく組み合わせて、より柔軟なプログラムを作ることができるようになるよ!