オブジェクト指向 中級

61. メソッドのオーバーライドとsuper()

オーバーライドとは

継承は親クラスの機能をそのまま使えて便利ですが、「鳴き方は動物によって違うから、子クラスごとに変えたい」ということもよくあります。子クラスで親クラスと同じ名前のメソッドを定義すると、その子クラスではそちらが優先して使われます。これを「オーバーライド(上書き)」と呼びます。

super()で親クラスの処理も呼び出す

オーバーライドした上で、「親クラスの処理はそのまま活かしつつ、追加の処理も行いたい」という場合はsuper()を使います。super().メソッド名()と書くことで、子クラスの中から親クラスの同名メソッドを呼び出すことができます。まったく作り直すのではなく、親の処理に「乗っかる」ようなイメージです。

サンプルコード

class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print(f'{self.name}は鳴きます')

class Dog(Animal):
    def speak(self):
        super().speak()
        print(f'{self.name}: ワンワン!')

dog = Dog('ポチ')
dog.speak()
Dogクラスはspeak()メソッドをオーバーライドしていますが、その中でsuper().speak()を呼んでいるため、親クラスAnimalのspeak()(「ポチは鳴きます」)も実行された上で、続けて「ポチ: ワンワン!」という子クラス独自の処理も実行されます。

📝 練習問題

練習問題:Animalを継承したCatクラスでspeak()をオーバーライドし、super()で親の処理を呼んだ後に「ニャー」と表示してください。