【Python】クラスの継承とオーバーライドとは?|サックリかんたん解説

初心者向けサックリかんたん解説

ここでは一通りPythonを勉強した私が「ここはわかりづらいだろうな」と思った点や、最近Pythonの勉強をし始めたという初心者の方がつまづきがちな点をピックアップし、長ったらしくならないようできるだけ簡単にサクッと解説していきます。

クラスの継承

クラスとは、独自のデータ構造を作るための設計図のようなものですね。

継承とは、オブジェクト指向プログラミングの大きな要素の一つであり、他のオブジェクト指向型プログラミング言語でも当たり前に存在する考え方です。

継承を一言で簡単に言うと次のようなものです。

「継承」とは

使いたい既存のクラス(親クラス)のコードをまるまる新しいクラス(子クラス)引き継がせること。

ちなみに、

  • 親クラスは、スーパークラス、基底クラス
  • 子クラスは、サブクラス、派生クラス

とも言います。

クラスの継承の簡単な例

それではさっそくとても簡単な例を見てみましょう。

ここでは、継承の説明で定番の車の例を用いて見てみます。

ちなみにこの__init__(self)というのはクラスを宣言する上での決まり事のようなものです。

1 : class Car():                   # 車を表すクラス: Car
2 :     def __init__(self, name):  # クラスCarは文字列を受け取り、.nameにその文字列を格納する
3 :         self.name = name
4 :     def talk(self):            # "talk"という名前のprintを行う関数を持つ
5 :         print("私は車です!")
6 : 
7 : class Prius(Car):              # プリウスを表すクラス: Prius
8 :     def __init__(self, name):
9 :         self.name = name       
10: 
11: my_prius = Prius("プリウス")    # プリウスという文字列はこの例では.nameに格納しているだけで使いません
12: my_prius.talk()

こちらを実行してみると、次のような結果が得られます。

私は車です!

それでは、解説していきます。

こちらの例では、親クラスCarを継承させたPriusのクラスを作成しています。

実際に継承させるためには、5行目の class Prius(Car): のようにかっこの中に継承したいクラスを書くだけです。
そうすると、親クラスのコードに存在する関数などをそのままコピーし、子クラスでも使うことが出来るようになります。

そのため、8,9行目を見ると、 my_prius 変数は Priusクラスのインスタンス(実体)であるにもかかわらず、親クラス Car の持つ関数 talk を使うことが出来るようになっていることが確認できます。

どうでしょうか、とても簡単ですね。

メソッドのオーバーライド

上の例を見ると、継承がとても便利なものであることは理解できたと思います。

それでは、せっかく継承を覚えたので上の例のようにプリウス以外にもたくさんの車をクラスの継承によって宣言していくことを想定しましょう。

…しかし、いろんな車のクラスを作ってみるものの、talk関数を使うと全ての車がみんな”私は車です!”としか言ってくれません。
なので車によってそれぞれが自分の車種を言うように(プリウスなら”私はプリウスです!”と言うように)したいですね。

そういったときにメソッド(関数)のオーバーライドです。

メソッドのオーバーライドとは

親クラスのメソッド(関数)をオーバーライド(上書き)すること

オーバーライドは、上書き、再定義、などという言い方もできます。

このメソッドのオーバーライドはとても簡単なので次の例でみていきましょう。

ここでは、さっき言ったように、”車によってそれぞれが自分の車種を言うように(プリウスなら”私はプリウスです!”と言うように)”さきほどのコードを改変していきます。

1 : class Car():                 # 車を表すクラス: Car
2 :     def __init__(self, name):
3 :         self.name = name
4 :     def talk(self):
5 :         print("私は車です!")
6 : 
7 : class Prius(Car):            # プリウスを表すクラス: Prius
8 :     def __init__(self, name):
9 :         self.name = name
10:     def talk(self):
11: 
        print("私はプリウスです!")
12: 
13: my_prius = Prius("プリウス")
14: my_prius.talk()

実行結果がこちら。

私はプリウスです!

しっかりと、それぞれの車が自分のname変数を参照してその名前を用いて自己紹介するようなコードになりましたね。

メソッドのオーバーライドは簡単です。すでに定義されている親クラスの中に存在する改変したいメソッド(関数)の名前を用いて上の例のように内容を書き換えるだけです。

ここで大事なのは、オーバーライドを行ったとき、親クラスのメソッドは書き換えられないまま残るということです。

これは覚えておきましょう。

継承やオーバーライドの何がありがたいのか

継承やオーバーライドがありがたいのは、元となる親クラスのコードを書き換えないという点です。

そのため、既に定義されている大規模なクラスのコードをそのままにした状態でそのクラスが持つ機能をまるまる使うことができます。

さらに、オーバーライドによって継承したクラスのメソッドを自分の使いやすいように、好きなように書き換えることもできます。

終わりに

ここまで見てくださりありがとうございました!

継承はオブジェクト指向型プログラミングの考え方において大事な要素です。。
こうやって簡単な例でみてみるととても単純な内容なのでしっかりと習得しておきましょう。

※こちらの解説は「入門Python3」という本を参考にしました。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です