こんにちは(@t_kun_kamakiri)(‘◇’)ゞ
この記事では、Pythonのクラスの継承について解説します。
主に「Pythonクラスの継承のコードの書き方」について解説しましたのでクラスの継承の初学者はコードを実際に走らせてみて学習を進めてください。
前回の記事で「クラスの基本定義」について解説しましたのでまだ見ていない方は是非どうぞ(^^)/
この記事はこんな人のために書きました。
- クラスの継承って何?
- オーバーライドの仕方がわからない!
- 子クラスから親クラスのメソッドを呼び出す方法
- 別ファイルのクラスは継承できないのかな?
こちらの本がPython初心者が挫折することなく勉強できる本です。
(本記事のようのPython使用環境と異なりますが、とてもわかりやすいので全く問題ありません)
クラスの継承とは何か?
もともと作ってあるクラスに「追加や変更したい部分だけを定義した新しいクラスを作ること」です。
この記事では以下の内容を実際にコードを書きながら解説します。
- 簡単なクラスの継承機能
- オーバーライドとは?
- 子クラスから親クラスのメソッドを呼び出す方法
- 別ファイルのクラスを継承する
簡単なクラスの継承機能
- 簡単なクラスの継承機能
- オーバーライドとは?
- 子クラスから親クラスのメソッドを呼び出す方法
- 別ファイルのクラスを継承する
この記事ではPythonのクラスの継承のコードの書き方について記載しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | class kamakiri(): kamakiri_num = 4 def run(self): print('ダッシュ') def eat(self): print('食べる') def get_kamakiri(self): print(self.kamakiri_num) #クラスの継承 class kamakiriClass(kamakiri): def __init__(self): print('カマキリです') kamakiri_pro = kamakiriClass() |
実行結果
1 | カマキリです |
上のコードは以下のようになっています。
- kamakiriという名前のクラスを定義(←親のクラス)
- kamakiriCkassという子クラスがkamakiri(親クラス)を継承
- kamakiri_pro = kamakiriClass()で子クラスをインスタンス化
kamakiri_pro = kamakiriClass()をインスタンス化した時点で、kamakiriClass(子クラス)の中の
1 2 | def __init__(self): print('カマキリです') |
が実行されて「カマキリです」と表示したというわけです。
kamakiriという名前のクラスには、さらに「run」「eat」「get_kamakiri」という関数があります。
関数「run」「eat」「get_kamakiri」を子クラスから呼び出してみましょう。
「<インスタンス化した子クラス名>.<親クラスの中の関数()>」
こう書くことでkamakiri_pro をインスタンス化した時点で親クラスの関数を使うことができます。
実際に書いてみましょう。
子クラスから親クラスの関数「run」を呼び出してみましょう。
1 | kamakiri_pro.run() |
実行結果
1 | ダッシュ |
うまく親クラスの「run」を実行できたようです。
では、次に子クラスから親クラスの関数「get_kamakiri」を呼び出してみましょう。
1 | kamakiri_pro.get_kamakiri() |
実行結果
1 | 4 |
うまく親クラスの「get_kamakiri」を実行できたようです。
クラスの継承の基本的なコードの書き方はこんな感じですね。
オーバーライドとは?
- 簡単なクラスの継承機能
- オーバーライドとは?
- 子クラスから親クラスのメソッドを呼び出す方法
- 別ファイルのクラスを継承する
これをオーバーライド(override(上書き))と呼びます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | class kamakiri(): kamakiri_num = 4 def run(self): print('ダッシュ') def eat(self): print('食べる') def get_kamakiri(self): print(self.kamakiri_num) #クラスの継承 class kamakiriClass(kamakiri): def __init__(self): print('カマキリです') def eat(self): print('ガオー') kamakiri_pro = kamakiriClass() |
実行結果
1 | カマキリです |
ここまでは、先ほどと同じです。
ここでは、あえて「親クラスの関数」と「子クラスの関数」を同じにしました。
1 | kamakiri_pro.eat() |
実行結果
1 | ガオー |
確かに子クラスの関数が優先して呼び出されましたね。
このように元のクラスを継承して新たに関数を書き換えることできる・・・・というのがオーバーライド(上書き)でした!
子クラスから親クラスのメソッドを呼び出す方法
子クラスから親クラスのメソッドを呼び出してみましょう。
- 簡単なクラスの継承機能
- オーバーライドとは?
- 子クラスから親クラスのメソッドを呼び出す方法
- 別ファイルのクラスを継承する
その際に使うのがsuper()です。
では、実際にコードを書いてみましょう。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | class kamakiri(): def __init__(self, num1, num2): self.kamakiri_num1 = num1 self.kamakiri_num2 = num2 class kamakiriCalass(kamakiri): def __init__(self, num1, num2): super().__init__(num1, num2) def cry(self): print( str(self.kamakiri_num1)+'本') print( str(self.kamakiri_num2)+'本') kamakiri_pro = kamakiriCalass(0,1) print(kamakiri_pro.kamakiri_num1) print(kamakiri_pro.kamakiri_num2) |
実行結果
1 2 | 0 1 |
ん?正直よくわからない・・・・(笑)
やっていることは、
まず「kamakiri_pro = kamakiriCalass(0,1)」とすることで引数「0,1」としながら、kamakiri_pro という名前でクラスのインスタンス化を行っています。
そうするとクラスのインスタンス化した時点で、「kamakiriCalassクラス」の中の初期化のメソッド「__init__」が実行されます。
「kamakiriCalassクラス」の中の初期化のメソッド「__init__」はsuper()によって親クラスのメソッドを呼び出しています。
そして最後に「print文」が2つ続いて、「<インスタンス化した子クラス名>.<子クラスの中の変数(superで親クラスの変数を呼び出した)>」とすることで、
実行結果が以下のようになりました。
1 2 | 0 1 |
ちまみに以下のように子クラスの中の関数を呼び出すとこうなります。
↓実行
1 | kamakiri_pro.cry() |
実行結果
1 2 | 0本 1本 |
ここまででクラスの継承の基本的なコードの書き方は以上です。
以上なのですが、クラスの定義自体は中身のコードをさほど知らなくても使うことができるという利点があります。
だったら、クラスの中身だけ別ファイルにしておいて、メインのコードだけシンプルに書く方が良い場合が多いでしょう。
というわけで「クラスは別ファイルにしておいて・・・・別ファイルのクラスを継承する」というのを以下でやります。
別ファイルのクラスを継承する
- 簡単なクラスの継承機能
- オーバーライドとは?
- 子クラスから親クラスのメソッドを呼び出す方法
- 別ファイルのクラスを継承する
「test.py」というファイルの中身を以下のように書きます。
1 2 3 4 | class animalBasic(): def __init__(self, num1, num2): self.animallegs1 = num1 self.animallegs2 = num2 |
そして「main_test.py」というのを以下のように書きます(これがメインのファイルです)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import test class dog(test.animalBasic): def __init__(self, a,b): super(dog, self).__init__(a, b) self.num_a = a self.num_b = b def cry(self): print( str(self.num_a)+'本') print( str(self.num_b)+'本') pochi = dog(0,1) print(pochi.num_a) print(pochi.num_b) |
ちょっとわかりにくいですが、「main_test.py」の冒頭で「test.py」を読み込んでいます。
1 | pochi.cry() |
1 2 | 0本 1本 |
まとめ
クラスの継承について解説をしました。
- 継承って何?
- オーバーライドとは?
- 子クラスから親クラスのメソッドを呼び出す方法
- 別ファイルのクラスを継承する
コードの開発においてはクラスの機能である「カプセル化、再利用可能」などを上手く使うことで自分だだけでなくコードの中身を全く知らない第三者にも使ってももらうことができるはずです。
そしてクラスの一部を使いまわししたいという場合にクラスの継承という機能はとても役に立ちます。
クラスの概念に慣れるのには時間を要しますが億劫がらずに使っていきたいところです(;^ω^)
↓以下がPython初学者のためのお勧めの参考書です。
[…] 【Python初心者】クラスの継承の基本定義とコードの書き方を解説する。 […]