第15回 応用 (2)

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

1. データクラス

概要

動画の解説を参照

これまでに見てきたように、クラスはデータ (インスタンス変数) と機能 (メソッド) を持ちます。
(インスタンスはオブジェクトなので、直接表示しようとしても内訳 (中の変数がどうなっているか) は見られません)
しかし、実際には機能は必要なく、データだけがあれば十分なケースもあります。

そのような場合はデータクラスを使います。
データクラスでは初期化メソッドを書くかわりに、インスタンス変数とその型だけを書きます。
print文にインスタンスを渡すと、それぞれのインスタンス変数の値が表示されます。


実は、データクラスでも通常のクラスと同様にメソッドを実装することはできます。
とはいえ、多くの場合はあえてメソッドは書かずに、インスタンスは「データを束ねたもの」として扱います。
データクラスでもインスタンス変数は自由に書き換えられますが、

このようにすると書き換えが禁止されます。
普通のクラスでもカプセル化することでクラス外からのアクセスを禁止することはできましたが、セッターを実装すればそれを経由して書き換えるという抜け道がありました。
それに対して、こちらの方法では本当に書き換えができません。

(実は普通のクラスのインスタンスでもできますが) データクラスのインスタンスは、== で「等しいかどうか」を判定できます。
インスタンス変数のすべてが一致していれば True, そうでなければ Falseになります。

課題1

以下のような「ユーザー名」「パスワード」の情報を持つデータクラス User、自分の名前と適当なパスワードを持つインスタンス u を作り、キーボードから2つの情報を入力させてそれらの情報をもつインスタンス tempを作ってそれが u と一致したら「ログイン成功」と表示し、一致しなければ「ログイン失敗」と表示してやりなおさせるコードを記述してください。
※ 「パスワードだけ間違い」「ユーザー名だけ間違い」「2つとも正しい情報」の順に入力してください。
(例)

2. 列挙型

動画の解説を参照

たとえばゲームを実装したいときは、開始前のタイトル、ゲーム中、クリア後、ゲームオーバー時などで表示すべきものやユーザーの入力に対して行うことが変わります。
一般には、フラグ的な変数を用意してその値に応じて場合分けを行います。

しかし、このように整数にしてしまうと、どの値がどういう状態に対応するのかが分かりにくくなります。
とはいえ、文字列で場合分けすると、スペルミスや大文字・小文字の表記ゆれなどで正しく認識できない危険があります。
このような場合は列挙型が役に立ちます。
列挙型もクラスの一種で、「値に名前をつける」ような使い方ができます。
この場合の TITLE~GAMEOVER のことを列挙定数といいます。

「Mode.」まで入力するとこのように候補が表示されます。
このおかげで、どのような状態を準備していたかを覚えていなくてもよくなります。
Modeのような場合分けのフラグの場合は、意味だけが重要であり具体的な数値はなんでも構いません。
とはいえ、定義するときに間違って同じ数値を別なものに割り当ててしまうと誤動作の原因になります。
「auto」を使うと自動的に数値が割り当てられるので便利です。

Enum型と似たものとして、StrEnum型があります。
こちらは数値ではなく文字列が割り当てられます。

こちらでもEnumと同様にautoで値を自動的に作れます。
値は列挙定数を小文字にした文字列になります。

これはユーザーに入力させたものとの一致の判定を行うときに役立ちます。

課題2

攻撃・防御・魔法・アイテム使用の4通りに対応するStrEnum型 Commandを作り、キーボードからコマンドを入力させてそれぞれに応じた内容を表示し、どれにも対応しないものを入力するまで繰り返すコードを記述し、結果を確認してください。
※ 4通りのコマンドを入力し、そのあとでどれでもないものを入力してください。

(実行例)

提出

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