【脱オブジェクト指向初心者!】Pythonの継承の基礎を学ぼう

今日は、pythonの継承の考え方について説明させていただきます。

継承って何?
オーバーライドの仕方がわからない!
別ファイルのクラスは継承できないのかな?

今回はそんな疑問を持たれている方へ向けて、

  • 【基礎】継承とは?
  • 【基礎】オーバーライドとは?
  • 【応用】子クラスから親クラスのメソッドを呼び出す方法
  • 【応用】別ファイルのクラスを継承する方法

を説明させていただきます。継承はオブジェクト指向で避けては通れない考え方になるので、ぜひここで基礎を覚えていってください!

なお、ここでは”クラス”、”メソッド”、”コンストラクタ”といった用語が登場します。これらについてご存知でない方は、以下の記事を参照してみてください。上記用語の基本的な考え方が記載されております。

【Python入門】クラスの使い方を簡単解説で楽々マスター
更新日:2024年5月10日

本記事では”継承”に関する事にのみフォーカスをあてておりますので、あらかじめご了承ください。

本記事を読む前に、Pythonがどんなプログラミング言語なのかをおさらいしておきたい人は次の記事を参考にしてください。

→ Pythonとは?特徴やできること、活用例をわかりやすく簡単に解説

なお、その他のPythonの記事についてはこちらにまとめています。

目次

継承とは

コーディングしている時、「既存のクラスとほとんど一緒だけど少しだけ変更を加えたクラスを作りたい」なんて時があると思います。そんな時、継承によって問題を解決することができます。

継承は指定した既存のクラスから、追加や変更したい部分だけを定義した新しいクラスを作ることを言います。

ここで、実際に継承の例を確認してみましょう。まず、以下のような”animal”クラスがあります。

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

この”animal”クラスを継承した、”dog”クラスを作成します。

class animal():
    def __init__(self, name):
        self.name = name
    
class dog(animal):
    def cry(self):
        print (self.name + ": bow-wow")

pochi = dog("Pochi")
pochi.cry()

このように、クラス名を宣言する時に、括弧の中に継承したいクラス名を入れることで継承ができます。上記の例では、継承したdogクラスでcryメソッドを追加しています。

これを実行すると、以下のようになります。

Pochi: bow-wow

用語についても少し触れてみましょう。

継承された元のクラスのことを親、スーパークラス、基底クラスと言います。また、新しく作ったクラスを子、サブクラス、派生クラスと言います。「親、子」、「スーパー、サブ」という呼び方をそれぞれセットにして覚えておくと良いでしょう。

オーバーライドとは

上述の例では、スーパークラスのメソッドをそのまま使っていました。ここではオーバーライドという親クラスのメソッドを「上書き」する方法を紹介します。

ポイントは、サブクラスでオーバーライドしたいメソッドをスーパークラスと同じメソッド名で定義することです。ここで、実際の例を確認してみましょう。

class animal():
    def __init__(self, name):
        self.name = name
    def message(self):
        print("I'm a " + self.name + ".")
    
class dog(animal):
    def message(self):
        print ("I'm a " + self.name + ". bow-wow!")

tama = animal("Tama")
tama.message()

pochi = dog("Pochi")
pochi.message()

サブクラスで”message”メソッドをオーバーライドしていますね。

実行結果は以下になります。

実行結果:

I'm a Tama
I'm a Pochi. bow-wow!

オーバーライドを行なったインスタンスでは、”message”メソッドが上書きされていることがわかりますね。このようにして、スーパークラスの一部だけを変更したサブクラスが作られます。

また、サブクラスに独自のメンバ変数を追加したり、既存のメンバ変数を書き換えたりしたい場合などは、スーパークラスのコンストラクタを呼び出したあとに追加すれば問題なく動作します。

例:

class animal():
    def __init__(self, name):
        self.name = name
    
class dog(animal):
    def __init__(self, name):
        super(dog, self).__init__(name)
        self.name = "Dog: I'm a " + name
    def cry(self):
        print (self.name + ". bow-wow")

pochi = dog("Pochi")
pochi.cry()

実行結果:

Dog: I'm a Pochi. bow-wow

サブクラスからスーパークラスのメソッドを呼び出すには

さて、直前にあげた例では”super()”という新しい用語が出ています。これは、スーパークラスのことを示しています。”super().__init__()”のようにすることで、スーパークラスのメソッドを呼び出すことができます。

ただ、これには注意点があります。Python 2系の場合は、スーパークラスの宣言時の括弧に”object”と入れる必要があります。これをしないと、エラーとなってしまいますので要注意です。なお、上記の例はpython2系で書いたものです。

python3系ではこれが不要で、もしpython3系で書きたい場合は以下のようになります。

class animal():
    def __init__(self, name):
        self.name = name
    
class dog(animal):
    def __init__(self, name):
        super().__init__(name)
        self.name = "Dog: I'm a " + name
    def cry(self):
        print (self.name + ". bow-wow")

pochi = dog("Pochi")
pochi.cry()

実行結果は上記と同じです。

別ファイルのクラスを継承するには

最後に、別ファイルのクラスを継承する方法を紹介します。先ほどのスーパークラスとサブクラスを別ファイルにして継承してみましょう。

test1.py:

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

これをtest.pyファイルで参照すると、

test.py

import test1

class dog(test1.animal):
    def __init__(self, name):
        super(dog, self).__init__(name)
        self.name = "Dog: I'm a " + name
    def cry(self):
        print (self.name + ". bow-wow")

pochi = dog("Pochi")
pochi.cry()

ポイントは、継承したいクラスのあるファイル名をインポートする事です。

これを実行すると、

Dog: I'm a Pochi. bow-wow

今まで同様、継承してオーバーライドできていることが分かります。

まとめ

いかがでしたか?今回の記事では、

  • 【基礎】継承とは?
  • 【基礎】オーバーライドとは?
  • 【応用】子クラスから親クラスのメソッドを呼び出す方法
  • 【応用】別ファイルのクラスを継承する方法

について説明させていただきました。継承やオーバーライドはオブジェクト指向において最初につまずく箇所かと思いますが、実際に扱って見るとそれほど困難な壁ではありません。

ここで基礎を理解し、快適なpythonライフを送ってください!

この記事を書いた人

【プロフィール】
DX認定取得事業者に選定されている株式会社SAMURAIのマーケティング・コミュニケーション部が運営。「質の高いIT教育を、すべての人に」をミッションに、IT・プログラミングを学び始めた初学者の方に向け記事を執筆。
累計指導者数4万5,000名以上のプログラミングスクール「侍エンジニア」、累計登録者数1万8,000人以上のオンライン学習サービス「侍テラコヤ」で扱う教材開発のノウハウ、2013年の創業から運営で得た知見に基づき、記事の執筆だけでなく編集・監修も担当しています。
【専門分野】
IT/Web開発/AI・ロボット開発/インフラ開発/ゲーム開発/AI/Webデザイン

目次