今日は、pythonの継承の考え方について説明させていただきます。
オーバーライドの仕方がわからない!
別ファイルのクラスは継承できないのかな?
今回はそんな疑問を持たれている方へ向けて、
- 【基礎】継承とは?
- 【基礎】オーバーライドとは?
- 【応用】子クラスから親クラスのメソッドを呼び出す方法
- 【応用】別ファイルのクラスを継承する方法
を説明させていただきます。継承はオブジェクト指向で避けては通れない考え方になるので、ぜひここで基礎を覚えていってください!
なお、ここでは”クラス”、”メソッド”、”コンストラクタ”といった用語が登場します。これらについてご存知でない方は、以下の記事を参照してみてください。上記用語の基本的な考え方が記載されております。
本記事では”継承”に関する事にのみフォーカスをあてておりますので、あらかじめご了承ください。
本記事を読む前に、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ライフを送ってください!