第10回 クラスの定義

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

1. 初期化メソッドによるインスタンス作成

概要

動画の解説を参照

クラスとは、オブジェクト指向プログラミングの中心となるもので、大雑把にいうと値と仕事を持った実体をつくるための約束事のようなものです。
例えば「学生」を表すクラスはこのような形で定義できます。
赤枠の部分を初期化メソッドといいます。
これだけでは「学生とはこういう情報を持っているものだ」ということを書いているだけで、具体的に誰かを表すものではありません。

このようにすると、名前を学籍番号を持ったインスタンス (特定の人を表す変数) s を作れます。
その人の名前、その人の学籍番号は、s の後ろに「.name」「.id」をつければ取り出せます。
これらの個々の情報を表す変数をインスタンス変数といいます。

あとから情報を追加することもできます。
このようにすると、学年を表すインスタンス変数「grade」を追加できます。

とはいえ、後から情報を追加するのは好ましくありません。
たとえばAさんは「名前と学籍番号と住所」、Bさんは「名前と学籍番号と身長」のように、人によって持っている情報の種類が違ったりすると扱いが難しく、予期しない動作の原因になるためです。
そこで、一般にはクラスを記述するときに「slot」を使って変数を制限します。
こうすれば Student のインスタンスは name と id 以外の情報を持てなくなり、別のものを追加しようとするとエラーになります。

課題1

上の Student クラスの変数を name, id, grade の3つだけを持つように初期化メソッドを修正し、自分の情報を持ったインスタンス s を作り、以下のような情報を表示するコードを記述してください。

2. インスタンスメソッド

動画の解説を参照

課題1ではクラスの外で s の情報を取りだして自己紹介の文を作りましたが、このような「仕事」はクラスの中に記述するとコードがすっきりします。
前回までやったような関数のようなものですが、厳密にいうとインスタンスメソッドといいます。
自己紹介をするメソッドはこのようになります。

特殊なメソッドとして、「__str__」があります。
これは、クラスの外から呼び出すと特定の文字列を返すものです。
インスタンスの情報を確認するためによく使われます。
(表示のためのコードが「print(s.__str__())」でなく「print(s)」であることに注意してください)

例えば平面ベクトルを表す Vector2クラスを作った場合も、__str__メソッドでベクトルの成分を書き下した文字列を取得できます。
さらに、「__add__」「__sub__」でベクトル同士の足し算・引き算を行った結果を返すことができます。
これらは「+」「-」で呼び出せるので、非常にすっきりした形で計算を行えるようになります。

課題2

※ 準備 : 学籍番号を入れて「入力」をクリック (タップ) してください。


Vector2クラスにメソッド を追加し、計算結果を確認するコードを書いてください。
※ ベクトルの成分は、下のスクリーンショットとは別のものにしてください。
\(\boldsymbol{a}=(a_x, a_y), \boldsymbol{b}=(b_x, b_y)\) としたとき、数学的な書き方だと内積、外積、大きさはそれぞれ以下のようになります。
内積 : \(\boldsymbol{a}\cdot\boldsymbol{b} = a_xb_x + a_yb_y\)
外積 : \(\boldsymbol{a}\times\boldsymbol{b} = a_xb_y - a_yb_x\)
大きさ : \(|\boldsymbol{a}| = \sqrt{a_x^2+a_y^2}\)
(例)

3. クラス変数とクラスメソッド

動画の解説を参照

これまでに出てきたインスタンス変数 (name, id, grade など) は、インスタンス (特定の学生) に紐づけられたものでした。
これとは別に、クラス自体に変数を持たせることができます。例えば学生の人数にあたるクラス変数 number は、このようにして実装できます。
人数である number は s0, s1, s2 のような特定の誰かに属するものではなく、Studentクラスそのものに属します。
人数は学生を作るたびに増えてほしいので、初期化メソッドで値を 1 増やします。
クラス外からアクセスするには、「クラス名.クラス変数名」のように書きます。

人数を表示するメソッドをクラスの中に書くこともできます。これをクラスメソッドといいます。
これも特定の誰かではなく、クラス自体から呼び出す形になります。

インスタンスは「del」で削除できます。
ただし、そのままでは実際の人数が減っても「number」は減りません。
そこで、クラス内に「__del__」メソッドを追加して人数を減らす処理を記述します。
これで、インスタンスが消されるタイミングで number もそれに合わせて減るようになります。

課題3

Studentクラスに、2年生の数を表すクラス変数 number_2nd を追加し、全学生数と2年生の数を表示するようにshow_numberを変更して、以下のような処理を実行して結果を確認してください。
※ どちらかの学生の情報は自分のものにしてください。

(実行例)
Google Colabの環境では、それまでに実行したコードの変数などの値が一時的に記憶されるため、想定外の表示になることがあります。
数値がおかしいときはセッションを再起動してから実行してください。

提出

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