タイトル画像
琴葉茜

さて、ここでは「オブジェクト」を管理するためにも必要になる「class(クラス)」について紹介するよ!

解説画像1
琴葉葵

なんか難しそう...
別にクラスを使わないで辞書型で管理しても同じじゃないの??

琴葉茜

それが、格段に便利さが違うんだよねー

琴葉茜

例えば、RPGのキャラクターを管理する場合で考えてみると良くて、基本ステータスをキャラクターごとに設定する時に辞書型を使っていると、毎回キーの名前を設定するのは大変じゃない?

解説画像2
琴葉葵

確かに!...でも、それならデータを外部ファイルで管理して、そこから読み込む形にすれば良いんじゃない?

琴葉茜

それも確かに良い考え方だね!
じゃあ、もしキャラクターごとの「基本行動が共通」だった場合はどうしようか?

琴葉葵

「攻撃をする」「魔法を使う」みたいな時だよね?それは、事前にそういう共通する関数を作っておけば良いんじゃないの?

解説画像3
琴葉茜

もちろん、そうやっても良いだろうけど、その時の関数は引数がすごくややこしいことになってないかな?

琴葉葵

あー...引数が多くなったら誰の何のステータスを引数に入れないといけないかを毎回考えないといけないし、更新するステータスはどれかって事も分からなくなってくるね

琴葉茜

そうでしょ
だけどクラスなら変数の値だけじゃなくて、関数も保持できるようになるんだ

琴葉茜

ひとまず、さっきの「相手からの攻撃を受けた」っていう関数をクラス内で作るとどうなるか見てみようか

解説画像4
琴葉葵

ちょっと待って!!
その前に「__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だよ!

琴葉葵

ほうほう
確かにそうすると引数の指定が少なくなるから良いね

琴葉茜

もう少しイメージが付くようにさっきのプログラムの流れをイメージで表現するとこんな感じだね

解説画像6
琴葉茜

各キャラクターごとに初期ステータスを割り当ててあげると、その値をクラスの変数に与えてあげた状態で別々に管理できるようになってるのが分かるよね

琴葉葵

同じ仕組みで動くけど、持っているステータスだけが違ってくるようなものをたくさん作りたい時には確かに便利だね!

琴葉茜

こうやって、各キャラクターごとに機能を持たせたり、ボタンとかのGUIの部品それぞれに機能を持たせられるようにして、全体の動きを作り上げていく考え方が「オブジェクト指向」ってことになるんだ

琴葉葵

ようやく雰囲気は分かってきたかも

琴葉茜

クラスに関しては、これからGUIを作っていく過程で使う機会が出てくると思うし、作っていくうちに感覚も慣れてくると思うから今はそれで十分だよ!

琴葉葵

習うより慣れろってことだね!使えるように頑張る!!