第12回 継承

本題に入る前に必ず連絡の動画を見てください。
Google Colabへのリンク

1. 継承

概要

動画の解説を参照

まず、名前の情報だけを持つ Personクラス、つまり「人」を表すクラスを考えてみます。

名前と学籍番号の情報を持つ Studentクラスはこれまでと同様に書けますが、「学生」は「人」の中の小分類と考えることもできます。
そこで、Personクラスの情報のうち name を引き継いで、学生独自の情報 id を追加した形で Studentクラスを書くことができます。
これを継承といいます。
継承の元になったクラス (この場合は Personクラス)のことを基底クラス (またはスーパークラス、親クラス)と呼びます。
継承してできたクラス (この場合は Studentクラス) のことを派生クラス (またはサブクラス、子クラス) と呼びます。
「super().」をつけると派生クラスから基底クラスのメソッドを呼び出せます (上のコードの青枠)。
派生クラスをさらに継承して別のクラスを作ることもできます。
name, id は学生と同様に持っていて、独自に奨学金 scholoarship を持つ、奨学生の ScholarshipStudentクラスはこのように書けます。

こうするとScholarshipStudentクラスは3つの変数を持つようになり、このように使用できます。
複数の単語からなるクラス名は、それぞれの単語の頭文字を大文字、それ以外を小文字にします。「_」はつけません。
このような書き方を「キャメルケース」といいます。
複数のクラスを継承して派生クラスを作ることもできます。
例えばガソリン車のクラス

と電気自動車のクラス

の両方を継承したハイブリッドカーのクラスはこのようになります。
この場合は「親」が2つなので、初期化メソッドを呼ぶときは「super().」ではなくクラス名を明示的に書きます。


※ GasVehicle と ElectricVehicle では __slots__ によるインスタンス変数の制限を行っていないことに注意してください。
2つの「親」から継承するとインスタンス変数が増えるので、制限してしまうとエラーになります。

課題1

上の最初の (Personクラスのみの) コードをベースにし、Personを継承して「給料 salary」を持つ社会人 BusinessPersonクラスを作り、自分の名前と適当な給料を持ったインスタンス bp を作り、 その情報を表示するコードを記述してください。
(例)

2. オーバーライド

動画の解説を参照

継承を行うと、インスタンス変数だけでなくメソッドも派生クラスに受け継がれます。
例えば基底クラスである Personクラスに自己紹介の introduceメソッドを記述すると、派生クラスである Studentのインスタンスからそのメソッドを呼び出せます。

Studentクラスにも同名の introduceメソッドを記述すると、Studentクラスのインスタンスから呼び出したときはそのメソッド (新しく書いたメソッド) が呼び出されます。
これをオーバーライドといいます。

課題2

課題1のコードをベースにして Personクラスを以下のように改変し、BusinessPersonクラスに elapseメソッドをオーバーライドするメソッドを追加し、結果を確認するコードを書いてください。

(例)

3. ミックスイン

動画の解説を参照

例えば平面上の点を表すクラス Point2を作り、さらにその点を変数として持つクラス (円 Circle と三角形 Triangle) を作ると、例えばこのようになります。

これらの情報を表示するメソッドを作ると、特に円の方は点 c とただの数 r で構成されているので、ちょっと複雑な形になります。
とはいえ、ただの数を含まない三角形のクラスに同じ形のメソッドを入れても正しく動作します。

しかし、このように大きくて全く同じメソッドを両方のクラスに書くのは非効率です。
そこで、このメソッドだけを持つ特別なクラス ShowMixin を作り、現状の3つのクラスにはそれを継承させます。
こうすることでそれぞれのメソッドではいちいち表示のためのメソッドを書かなくても良くなります。
(ついでに Point2 メソッドでも情報表示ができるようになります)
ShowMixinはshowメソッドを持つだけで、変数のないクラスです。
つまり、これ自身のインスタンスを作ることを想定しておらず、他のクラスに継承されることだけを目的としたクラスです。
このようなクラスをミックスインといいます。

課題3

上のコードからp, c, t の作成と情報表示の処理を除き、四角形を表す Quadrangleクラスを追加し、適当な頂点の座標を与えてインスタンス q を作り、showメソッドで情報を表示するコードを書いてください。
(実行例)

提出

今回作成したノートブックを「plang2024a@gmail.com」と共有してください。
※ 課題の再提出の際は、ノートブックの再度の共有はせずにチャットで連絡してください。