さて、ここでは「オブジェクト」を管理するためにも必要になる「class(クラス)」について紹介するよ!
なんか難しそう...
別にクラスを使わないで辞書型で管理しても同じじゃないの??
それが、格段に便利さが違うんだよねー
例えば、RPGのキャラクターを管理する場合で考えてみると良くて、基本ステータスをキャラクターごとに設定する時に辞書型を使っていると、毎回キーの名前を設定するのは大変じゃない?
確かに!...でも、それならデータを外部ファイルで管理して、そこから読み込む形にすれば良いんじゃない?
それも確かに良い考え方だね!
じゃあ、もしキャラクターごとの「基本行動が共通」だった場合はどうしようか?
「攻撃をする」「魔法を使う」みたいな時だよね?それは、事前にそういう共通する関数を作っておけば良いんじゃないの?
もちろん、そうやっても良いだろうけど、その時の関数は引数がすごくややこしいことになってないかな?
あー...引数が多くなったら誰の何のステータスを引数に入れないといけないかを毎回考えないといけないし、更新するステータスはどれかって事も分からなくなってくるね
そうでしょ
だけどクラスなら変数の値だけじゃなくて、関数も保持できるようになるんだ
ひとまず、さっきの「相手からの攻撃を受けた」っていう関数をクラス内で作るとどうなるか見てみようか
ちょっと待って!!
その前に「__init__」とか「self」とか初めて見るけど何者!?
「__init__」は「クラスの初期設定をする関数」で、クラスを使ってオブジェクトを作る時に動くんだ
「オブジェクトを作る時」っていうのは、今回のプログラムだと19,20行目のところだね
そういうこと!これで、勇者のステータスと敵のステータスを「self.hp = hp」みたいな感じでそれぞれ設定してるんだよ
それでそこだよ!「self」は一体なに??普通の「hp」と「self.hp」の違いはなんなの??
「self」は、「クラス自身の中で管理している変数や関数の情報を使う」ためのものなんだ
要は「セルフサービス」とかのセルフで「自分自身の」って意味??
そうだね!
「self」は、クラス内で何か処理をしたい場合に使うんだ
今回でいうと、勇者のHPを減らしたり、そのために勇者の防御力を参照する時に使ってるよね
確かに「self.hp」と「self.defense」を使ってるね
ちなみに、「self.hp」のようにクラスの中でのみ扱えるようにした変数を「インスタンス変数」って言うよ!
もし、クラスの外でインスタンス変数を使いたい時は「hero_status.hp」みたいに「変数名.インスタンス変数名」って感じで良いんだね
ということは、「enemy_status」と「hero_status」の中の「self.hp」はそれぞれ「enemy_status.hp」と「hero_status.hp」ってなるから別物扱いになる感じなんだね
そういうことだね!それと、クラス内の関数を呼び出す場合は24行目みたいに引数に「self」を付けずに、そこから後ろの引数だけを設定したらOKだよ!
ほうほう
確かにそうすると引数の指定が少なくなるから良いね
もう少しイメージが付くようにさっきのプログラムの流れをイメージで表現するとこんな感じだね
各キャラクターごとに初期ステータスを割り当ててあげると、その値をクラスの変数に与えてあげた状態で別々に管理できるようになってるのが分かるよね
同じ仕組みで動くけど、持っているステータスだけが違ってくるようなものをたくさん作りたい時には確かに便利だね!
こうやって、各キャラクターごとに機能を持たせたり、ボタンとかのGUIの部品それぞれに機能を持たせられるようにして、全体の動きを作り上げていく考え方が「オブジェクト指向」ってことになるんだ
ようやく雰囲気は分かってきたかも
クラスに関しては、これからGUIを作っていく過程で使う機会が出てくると思うし、作っていくうちに感覚も慣れてくると思うから今はそれで十分だよ!
習うより慣れろってことだね!使えるように頑張る!!
