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

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

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

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

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

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

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

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

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

なお、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ライフを送ってください!

Writer

遠藤貴大

株式会社SAMURAI

1991年生まれ。双子座。
理系大学で認証システムを学んだ後、アプリ開発者となる。
新しく学ぶ人に寄り添った記事を心がけて執筆します。
芸術が好き。いつか猫と暮らすのが夢。

あなたの目的に合わせた
SAMURAI ENGINEERの運営サービス

SAMURAI ENGINEER Pro

未経験でも挫折しないプログラミングスクール

詳細はこちら

SAMURAI ENGINEER Plus

日本最大級のサブスク型オンラインITスクール

詳細はこちら

SAMURAI ENGINEER Freelance

「一人で稼げる」スキルを身につける

詳細はこちら