オーバーライドについて

10.3 オーバーライドについて

これまでの学習ではサブクラスを作成する際に、メソッドの内容を拡張したい時、新規機能(メソッド)を追加してきましたが、スーパークラスと全く同じ定義(メソッド名、引数の数、型、並び)のメソッドを追加することもできます。
その機能をオーバーライド(override)と言います。実はこのオーバーライドを行うことで、サブクラス独自のコンストラクタを定義することができます。

オーバーライドとは

スーパークラス(親クラス)で定義されたインスタンスメソッドを、そのクラスを継承したサブクラス(子クラス)で独自に定義し直して上書きすることをいいます。サブクラスで機能を追加する必要がある場合などにオーバーライドを利用します。
オーバーライドをする際には、メソッド名は同じにする必要がありますが、引数、戻り値の型が同じである必要はありません。

オーバーライドのメリット

  • スーパークラスから継承したメソッドの代わりに、サブクラスのメソッドを動作させることができる。
  • 1つのメソッド名でそのオブジェクトのクラスに応じて、適切な処理(メソッド)を行わせることができる。
  • 複数のメソッド名を定義したり覚えたりする必要がなくなる。

上記で示したメリットではあまり便利な機能に感じないかもしれませんが、オーバーライドを行うのは「継承したスーパークラスのメソッドでは実現したい機能が満たせない、でも利用するメソッド名を変更することができない」といった場合になります。別の名前でメソッドを作成すればいいではないかと思うかもしれませんが、別の名前で似たような処理のメソッドを乱立させると管理が大変になる理由があり、このオーバーライド機能が提供されている理由にもなっています。

コラム

オーバーライド(Override)
スーパークラスのメソッドとメソッド名が同じメソッドをサブクラス内で再定義すること。

ではスーパークラスとサブクラスに同じ定義のメソッドがある場合、どちらのメソッドが呼び出されるのかをソースコードから確認していきます。

10.3.1 スーパークラスと同じ定義のメソッドをサブクラスに用意するプログラム

スーパークラスと同じ定義のメソッドをサブクラスに用意して、どちらのメソッドが動作するのか確認します。メソッドのオーバーライドについて学習しましょう。

ソースコード

ソース・フォルダー: /Desktop/Python基礎講座
ファイル名: 第10章.ipynb
アクセスURL: http://localhost:8888/notebooks/Desktop/Python基礎講座/第10章.ipynb

    class Computer:

        def __init__(self,name='windoes',memory='89'):
            self.name = name
            self.memory = memory

        def osMemory(self):
            print('【作成されたPCの内容】')
            print('・os名:',self.name)
            print('・メモリー:',self.memory,'GB')

    class notePc(Computer):

        def __init__(self):
            print('サブクラスのコンストラクタ実行されました。')

        def osMemory(self):
            print('サブクラスでosMemoryが実行されました。')

    npc = notePc()
    #osMemoryを呼び出し
    npc.osMemory()
	

実行結果

	サブクラスのコンストラクタ実行されました。
	サブクラスでosMemoryが実行されました。
	

解説

12行目でComputerクラスを継承したNotePcクラスを定義しており、クラス内でコンストラクタ用のメソッド、osMemory()メソッドを独自に定義してます。

    class notePc(Computer):

        def __init__(self):
            print('サブクラスのコンストラクタ実行されました。')

        def osMemory(self):
            print('サブクラスでosMemoryが実行されました。')
	

20行目でnotePcクラスからインスタンスを生成しておりますが、「サブクラスのコンストラクタ実行されました。」と出力されていることから、コンストラクタの情報が上書きされたことがわかります。

    npc = notePc()
	

22行目でnotePcクラスのインスタンスnpcを介してosMemory()を呼び出しております。

    npc.osMemory()
	

こちらも実行結果から、notePC内で定義したメソッドが呼び出されており、osMemory()が上書きされていることが確認できます。

先程のプログラムのスーパークラスとサブクラスのメソッド内容を比較してみましょう。

図 10.3.1: メソッドのオーバーライド

処理内容を見比べると実行結果では明らかにサブクラスの内容が出力されているので、上書きされていることが確認できます。

図 10.3.2: メソッドのオーバーライドで呼び出されるメソッドについて

ポイント

  • スーパークラスと同じ定義のメソッドを持つサブクラスから、そのメソッドを呼び出すとサブクラスのメソッドが呼び出される。

オーバーライドについて説明しましたが、スーパークラス機能と異なる同じメソッド名をメソッドを扱うことができても、継承元のメソッドの機能は引き継ぎされません。
またコンストラクタを再定義すると、継承元のスーパークラスのコンストラクタ内で宣言したインスタンス変数は引き継ぎされなくなります。
継承元から引き継いだメソッドに新しい機能を付け加えると同時に元の機能も継承したい場合、継承元のコンストラクタの中身を引き継ぎながら、新しくコンストラクタを定義するにはどうすれば良いのでしょうか。
次の項で確認していきましょう。


NEXT>> 10.4 super()関数について