Part15:クラス

絵里「じゃあ今回はクラスについて見ていくわね」
真姫「一応、オブジェクト指向の予習はしてきたわよ」
絵里「さすが話は早いわね」
真姫「OOPに関しては巻きでいいんじゃないかしら。ね、にこちゃん」
にこ「・・・そ、そうニコ、Pythonの解説なんだから、そ、そんなの飛ばしてもなーんにも問題ないニコよ♡」
真姫「喋り方Sidになってるわよ」
絵里「やれやれ・・・」

絵里「オブジェクト指向って、踏み込んで考えていくとどんどん難しめの概念論になっていくんだけど、とりあえず今ここでは何かのデータとそれを扱う処理をひとまとめにした『クラス』という考え方があって、そのコラボレーションでプログラムを構成していく、と考えればいいわ」
にこ「なんだかよくわからないわね・・・」
絵里「コード見ながら話をした方が早いと思うの。じゃあ、にこが好きそうな、アイドルの情報を扱うプログラムを考えてみましょうか」
にこ「おおっ、不思議と力が湧いてくるにこ」
真姫「凛の歌詞取らないの」

絵里「にこ、アイドルの『属性』ってどんなのがあるかしら?」
にこ「それはもちろん、清純、クール、眼鏡、ドジっ娘、メイド・・・」
絵里「オーケー、私が悪かったわ」
真姫「今のは失策ね」
絵里「そうね・・・アイドルが、プロフィールに書くような項目って、どんなのがある?」
にこ「プロフィール・・・名前、生年月日、年齢、出身地、身長、体重・・・は微妙かしら。スリーサイズ、好きな食べ物、嫌いな食べ物、好きな動物、愛称、子供の頃の夢、キャッチフレーズ・・・」
絵里「すとーっぷっ!」
真姫「にこちゃんの扱い方がまだまだね」
絵里「そうしたら・・・とりあえず、名前と年齢とキャッチフレーズ。この3つで考えましょう」

絵里「アイドルを表すクラスって、こんな感じになるわ」
真姫「新しく出てきたキーワードがいくつかあるけど」
絵里「使い方まで見た方が早いわ」

絵里「こんな感じ」
真姫「何となく、分かった気がするけど・・・Idol(...)のところが__init__(...)の呼び出しになってるの?」
絵里「そう。__init__は特別な関数で、Idolクラスのオブジェクトを作るときに実行されるの。コンストラクタと呼ぶわ」
真姫「それでできたIdolのオブジェクトが、nicoとかeliなのよね?」
絵里「Idolクラスのインスタンス、って呼ぶわね。クラスはあくまで雛形だから。具体的に、この例みたいににこや私を当てはめたのがインスタンス」
真姫「にこちゃん、ついてきてる?」
にこ「全てのアイドルはそれぞれ名前と年齢とキャッチフレーズを持っていて、自己紹介ができるにこ」
絵里「その抽象的な捉え方が正解かも。真姫はいきなり文法から入り過ぎね」
真姫(ちょっと悔しい)
絵里「文法面で説明がまだなのは、selfくらいかしら」
真姫「そうね・・・__init__にしてもintroduceにしても、引数の数が合わないのよね」
絵里「クラスで定義した関数には、selfは暗黙的に渡されるの。インスタンスそのものを指すわ」
真姫「えーと、nicoのintroduceを呼んだときのselfはnicoなの・・・?なんだかややこしい」
絵里「自分自身を参照するためのシステムね。__init__でself.nameに代入した名前は、introduceでself.nameで参照できる。そういうこと」

絵里「selfに関してはね、nicoに関してだとnicoとselfは同じものだから・・・」

絵里「こうやって、nameとかageとかを参照することもできるの」
真姫「クラス内でselfに対してできることはそのインスタンスに対してもできるわけね」

絵里「selfに設定した変数をインスタンス変数と呼ぶんだけど、これ実は自由に作り放題なのよね」
真姫「後から増やしたりもできるってこと?」
絵里「ええ。eli.height = 162とかやると、普通に身長を追加できちゃうし、しかも同じIdolのインスタンスにもかかわらず、eliはheightがあってnicoはheightがない、なんてことになるの」
真姫「ずいぶんフリーダムな仕様なのね」
絵里「便利な場合も多いんだけど・・・ちゃんと制限したい場合は、こうするの」

絵里「肝は__slots__よ。ここで指定した名前以外のインスタンス変数は使えなくなるわ」
にこ「__slots__とか__init__とか、この変な名前は何なの?」
絵里「Python独特よね。特別な意味を持つ名前は、こういう命名をすることでプログラマが付ける名前との衝突を避けてるみたい」
にこ「アニメキャラクターの命名と似たような思想にこ」
真姫「まあ、リアル知り合いと同姓同名はなんか嫌よね・・・」

絵里「最後に。introduce関数はどこからでも呼び出せたけど、これに制限をかけることもできるの」

絵里「説明用に簡単に書いたけど、にこなら一発で理解しそうね」
にこ「ライブはみんなに見に来てほしいけど、練習は基本的に非公開よ。お風呂なんて覗かれたら、スキャンダルもいいところよ!」
絵里「うん、大体合ってる」
真姫「・・・で、_と__の違いは何?」
絵里「_で始まる関数は、呼び出すことはできるんだけど、Pythonコミュニティでは非公開APIという暗黙の了解があるの。だから、呼ぶのはマナー違反」
真姫「練習見学は許可取ってから、ってわけね」
絵里「__で始まる関数は、そもそも呼び出せなくなるわ。そりゃ、絶対覗かれたくないもの」
真姫「lifeから呼び出してるのはありなのよね?」
絵里「同じクラスの中だからね。アクセス制御が効くのは、あくまで外からの呼び出し」

絵里「だいぶ長くなってきたから今回はここまで。次回も私が担当でクラスの継承の話をするわね」


LINEで送る
Pocket


返信を残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です