こんにちわ!この記事はPythonの初学者のための内容となっております。
今回は継承についての記述です。
- 継承って何!?
- 継承の具体的な使い方がわからない
- 継承を使った少し長めの実践的コードを見てみたい
という方向けの内容です。
また、前回は、アクセス制御についての記述でした。
それでは頑張っていこう!
コンテンツ
プログラミングスクールに関しては下の記事で詳しく記述しています。
こちらで紹介しているスクールは、すべて無料期間がある優良なスクールのみで、特徴を明確にし、読者のニーズに絞って丁寧に解説しました。初めての一歩として、無料説明会に参加してみてください。
継承の基本
継承とは
継承(Inheritance)とは、同じ性質を再利用することで、楽にプログラムを記述する方法です。
例えば、「動物」クラスがあったとします。その中には、「犬」クラスや「猫」クラス、などが含まれるでしょう。さらに細かく「犬」クラスの中には「チワワ」クラスや「トイプードル」クラスなどがあってもいいでしょう。
最も簡単な継承のコードを記述します。
継承する場合、クラス名の後に、継承先のクラスをかっこ書きすることで継承が可能です。
1 2 3 4 5 |
class Animals: pass class Dogs(Animals): pass |
継承の考え方
継承の考え方の例として、抽象的から具体的になっていくのが基本になります。
「動物クラス」(スーパークラス)ではメソッド「eat」と、「sleep」が定義されているとしましょう。次に、「犬」クラス(サブクラス)では、「bark」、「sit」。猫クラス(サブクラス)では、「punch」、「meow」など、それぞれの特性をサブクラスで詳しく記述していきます。
サブクラスとして定義された「Dog」や「Cat」クラスには、定義されたメソッドの性質に加えて、動物として基本的な「eat」、「sleep」もサブクラスに含まれます。
つまりスーパークラスである、「Animals」に書かれているメソッドや変数は、サブクラスで継承した場合、再定義する必要がなくなります。これによって、効率的にコードを記述することが出来ます。
ちなみに、画像内の矢印の向きにも一応意味があります。継承の場合、サブクラス(子クラス)からスーパークラス(親クラス)へ矢印が向きます。
コードの記述例
今回は、スーパークラスである、「Animals」のみコンストラクタが設定されています。そして、サブクラスである、「Dogs」、「Cats」は、「Animals」を継承しているため、継承元のメソッドや、メンバ変数を再定義しなくても利用できるようになります。例を見ていきましょう!
※すべてのコードを一つにすると実行できます。
スーパークラス:「Animals」
1 2 3 4 5 6 7 8 9 10 11 12 13 |
class Animals: def __init__(self, name): self.name = name def getName(self): return self.name def eat(self): print(self.getName() + "は餌を食べた。") def sleep(self): print(self.getName() + "はスヤスヤ眠った。") |
メンバ変数は「name」のみです。メソッドは、画像の通り、「eat」、「sleep」。ゲッターメソッドに「getName」を準備しています。
サブクラス:「Dogs」
1 2 3 4 5 6 7 |
class Dogs(Animals): def bark(self): print(self.getName() + "は主人に吠えた。") def sit(self): print(self.gatName() + "はお座りをした。") |
サブクラス「Dogs」には、コンストラクタはありません。
サブクラス:「Cats」
1 2 3 4 5 6 7 |
class Cats(Animals): def punch(self): print(super().getName() + "は主人に猫パンチを繰り出した。") def meow(self): print(super().getName() + "はにゃーにゃー鳴いた。") |
サブクラス「Cats」にも、コンストラクタはありません。
継承では、「super()」を用いることで、スーパークラスのメソッドを呼び出すことが出来ます。
メイン関数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
if __name__ == "__main__": dog = Dogs("ポチ") cat = Cats("タマ") bird = Animals("トリ") dog.bark() cat.punch() bird.eat() """ ポチは主人に吠えた。 タマは主人に猫パンチを繰り出した。 トリは餌を食べた。 """ |
注意してみていきたいのは、メイン関数の出力結果と、これがエラーが出ることなく実行できるという点ですね。
サブクラス「Dogs」、「Cats」には、コンストラクタは設定されていないのですが、インスタンスを生成する際に引数が一つあります。これは、継承先のスーパークラス「Animals」に「name」を引数とした、コンストラクタがあるからですね。
また、今までのオブジェクト指向型プログラミング同様に、スーパークラスのインスタンスを生成することも可能です。これによって、自由に継承を使いこなすことが出来ます。
全体コード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
class Animals: def __init__(self, name): self.name = name def getName(self): return self.name def eat(self): print(self.getName() + "は餌を食べた。") def sleep(self): print(self.getName() + "はスヤスヤ眠った。") class Dogs(Animals): def bark(self): print(self.getName() + "は主人に吠えた。") def sit(self): print(self.gatName() + "はお座りをした。") class Cats(Animals): def punch(self): print(super().getName() + "は主人に猫パンチを繰り出した。") def meow(self): print(super().getName() + "はにゃーにゃー鳴いた。") if __name__ == "__main__": dog = Dogs("ポチ") cat = Cats("タマ") bird = Animals("トリ") dog.bark() cat.punch() bird.eat() """ ポチは主人に吠えた。 タマは主人に猫パンチを繰り出した。 トリは餌を食べた。 """ |
オーバーライド
カタカナ多いぜ!!
オーバーライド(override)とは、上乗りという意味です。すなわち、プログラムでは上書きするということです。同じ名前のメソッドを記述したいと思うときがあると思います。そのような時でも問題なく同じ名前でメソッドを定義できます。
オーバーライドの簡単な例を示します。
1 2 3 4 5 6 7 8 9 10 11 |
class Parent: def Print(self): print("aaa") class Child(Parent): def Print(self): print("bbb") child = Child() child.Print() #bbb |
メソッド名が同じ「Print」になっていますが、サブクラスのオブジェクトを生成しているので、サブクラスのメソッドが実行されました。このように、メソッドを上書きすることをオーバーライドといいます。詳しい説明は別の記事で記述しています。
また、オーバーライドと合わせて使いたい手法がキーワード引数です。
参考にしてみてください。
まとめ
今回は、継承を学習しました。継承では、抽象的から具体的に考え方のパラダイムシフトをします。継承は、同じような処理を再び記述するのは面倒なので、可能ならば再利用しようという考え方です。
スーパークラス(親)のメソッドを利用する場合は「super()」を用いることでアクセスが可能です。また、インスタンスを生成するときに、コンストラクタもスーパークラスのメンバ変数をもとに記述します。オーバーライドという考え方も、継承と似て非なる考え方ですので注意が必要です。
次回の継承2では、今回の継承の応用的な使い方を紹介していきます。テーマは、雇用管理プログラムの作成です。簡単に説明すると、あるお店では、アルバイトと店長とマネージャーがいます。これらのクラスは、すべて従業員に含まれますので、「Employee」が親クラスとなります。
全ての従業員には、名前や従業員番号などがあるでしょう。一方で、各役職によってお給料などが変わる部分を継承を用いて記述します。お楽しみに!
【Python入門】初めてのプログラミング(継承2)雇用管理プログラムの作成
本日の理解度調査
今日の最後に理解度調査をします!!
どうすれば正しくなるのか考えてみてね!!
Q. どのような出力結果になるか考慮せよ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
class Parent: def __init__(self, first_name, gender): self.first_name = first_name self.gender = gender def setLast_name(self, last_name): self.last_name = last_name def introduce(self): print("私の名前は" + self.first_name + self.last_name + "。" + self.gender + "性です。") class Child(Parent): def __init__(self, first_name, gender, school): super().__init__(first_name, gender) self.school = school def introduce(self) -> '@override': print("私の名前は" + self.first_name + self.last_name + "。" + self.gender + "性です。" + self.school + "に通っています。") if __name__ == "__main__": p1 = Parent("山田", "男") p1.setLast_name("太郎") p2 = Child("山田", "女", "○○小学校") p2.setLast_name("小太郎") p1.introduce() p2.introduce() |
正解は。。。
1 2 |
私の名前は山田太郎。男性です。 私の名前は山田小太郎。女性です。○○小学校に通っています。 |
わかったかな??正解出来たら今回の項目は完璧だね!!
最後まで記事を読んでいただきありがとうございます!
昔、自分が参考にしていたプログラミングについての書籍を紹介します。
プログラミングスクールに関しては下の記事で詳しく記述しています。
こちらで紹介しているスクールは、すべて無料期間がある優良なスクールのみで、特徴を明確にし、読者のニーズに絞って丁寧に解説しました。初めての一歩として、無料説明会に参加してみてください。