この記事は、岩手県八幡平市のプログラミング教室「アクセルキャンプ」の公開教材です。
アクセルキャンプ(フリースペースプラウド)のリンク
教材の作成依頼等も承っております。ご意見等は、リンク先の問い合わせ欄からお願いします。
教材の転用・利用等は自由です
安比のスキー場のシーズン券買っちゃったんだが
スキー一回もしたことないんだけど大丈夫かな?ていうか、いつ滑るねん!そこまで暇やないねん!ってなってるリッキーです。
ほな、なんでこうたん?てことですけど、買ったときはなんかテンション上がって、「今年はスキー頑張るぜ!」みたいになってたんですよ。皆さんは今年の冬はなにかこれをやろう!みたいなの決めてますか?サンタさんにお願いするものは決めてますか?
先に言っときます!!(キリッ)
今日やる内容ですが、コードを書いてればある程度は理解できるとは思いますが、「なんでコレが必要なの?」っていうのがなかなか伝わりにくい内容になってます。
例えるなら、お金でしょうか。「お金ってなんで必要なの?物と物を交換すればよくない?」って幼稚園児に聞かれて、しっかり説明するのって難しいけど、でもお金って超大事ですよね??
なるべくその辺をわかりやすく説明するつもりですが、「なんとなくわからんでもないけど、あとは使いながら覚えていこう」ていう理解でいいと思います。そんな感じで気楽に読んでくださいね!!
今日の主役:クラス (class)
みなさんは「クラス」という単語を聞いて、どういう意味を思い浮かべますか?真っ先に思いつくのが、学校の教室のことだと思います。八幡平では1学年に2クラスある小学校は一部の学校だけで、殆どは1学年1クラス、あるいは、複式学級のところもあったかもしれません。中学校はどうなんでしょう。そういう学校での人の まとまりのことを「クラス」といいますよね。
ただ、残念ながら(?)プログラミングにおいてはちょっと意味が変わってくるので一旦「クラス」の意味を整理しましょう。以後、クラスのことをclassと表記します。
class = データの設計図
みんな大好き、Nintendo Switchを作るプログラムを書いていくとしましょう。実際にSwitchをプログラムでポンと制作することはできないので、あくまで仮定の話です。
メンバーとメソッド
Switchを作るためには、いろんなデータが必要になります、例えば
・画面の縦・横の長さ
・ボタンの大きさ
・左コントローラの色
・右コントローラの色
・重さ
などなどです。これらの、Switchを作る際に登録する必要のあるデータを「メンバー」または、これらはクラスでは変数として扱われるため「メンバ変数」といいます。
また、Switchを作る際に、用意したデータを組み合わせたりして、いろんな機能をつけたりします。例えば
・ゲームを遊ぶ機能
・インターネットに接続する機能
・友達とチャットする機能
・購入したゲームを保存する機能
これらのことをメソッドといいます。メソッドはその性質から、処理をまとめた関数として扱われます。
Switch を作るクラスは、プログラム上では以下のようになります。なんとなく、コードっぽいものを書いているだけなので、当然このコードは動きません
#①クラスの書き方
class Nintendo_Switch:
#②初期化:コンストラクタ
def __init__(self, length_v, length_h, button_size, left_color, right_color, weight, saved_game):
self.length_v =length_v #縦方向の長さ
self.length_h = length_h #横方向の長さ
self.button_size = button_size #
self.left_color = left_color
self.right_color = right_color
self.weight = weidht
self.saved_game = saved_game
#③メソッド
def playGame(self, game):
if game in self.saved_game:
game.play()
def internet(self, wifi_id, wifi_password):
if wifi_id and wifi_password:
internet.connect()
def chat(self, friend, message):
message.sendToFriend()
def buyGame(self, game):
self.saved_game.append(game)
# ④インスタンス化
my_switch = Switch(800, 600, 20, "blue", "red", 420)
my_switch.playGame()
では、ざっくり部分部分を見ていきましょう。。。と言いたいところですが、その前に
self(セルフ)ってなんやねん
「セルフレジ」って言葉、聞いたことないですか?店員さんにお会計してもらうんじゃなくて 自分で「ピッ」ってやりながら会計するやつですね。あと、ガソリンスタンドとかで「セルフ給油」とかってみたことないですか?自分で入れるタイプのガソリンスタンドですね。
セルフには、「自分」とか「自身」とかっていう意味があります。↑の例以外でも
・himself = 彼自身の
・herself = 彼女自身の
・myself = 自分自身の
・selfish = 自己中心的な
のように、selfがつく単語は結構あります。
クラスの記述の中で、そのクラス自身のメンバーやメソッドをチェックしたい場合があります「Switchくん」が自分の構造を説明してくれているのを想像してください。 「ゲームを遊ぶ」機能を説明するときに「『俺の』ゲームリストの中にその遊びたいゲームがあったら、起動するぜ」みたいに説明するの、想像できますか?ここの『俺の』が、クラスで言うところのselfです。
では、順番に見ていきましょう。
クラスの構造
①クラスの書き方
class クラス名:
def __init__(self, 引数1、引数2):
self.メンバー1 = 引数1
self.メンバー2 = 引数2
...
def メソッド名(self):
処理
②初期化:コンストラクタ
Switchをいざ作ろう!というときに、
switch設計するぜ → switchの色わかんないぜ → switch製造するぜ
では困りますよね。そこで、
switch設計するぜ → switchの色は赤にするぜ → switch製造するぜ
のように、必要なデータ(メンバー)を整理するのに使うのが、この__init__の関数で、これのことを「コンストラクタ」と言います。
def __init__(self, length_v, length_h, button_size, left_color, right_color, weight, saved_game):
self.length_v =length_v #縦方向の長さ
self.length_h = length_h #横方向の長さ
self.button_size = button_size #ボタンの大きさ
self.left_color = left_color #左側コントローラの色
self.right_color = right_color #右側コントローラの色
self.weight = weidht
self.saved_game = saved_game
引数としてもらってきたデータに、self.をつけることで、「俺のモンだぜ!クラス内で使うぜ!」と宣言している感じですかね。コレをすることによって各データがクラスに登録されて、後述の④のところで例えば
print(my_switch.length_v)
とすることで、ちゃんとその内容が表示されるようになります。ちなみに、引数を取らず、コンストラクターのところでデータを直接作成することもできます。
③メソッド
メソッドは、関数の形をとり、メンバーを組み合わせたりしていろんな処理をすることで、単にデータを整理するコンストラクタと違い、クラスに動きをつけてくれます。
...っていうかめっちゃ関数してますが、普通の関数と違うところは、必ず第一引数にselfが入っている点です。これはなんでこうしなくちゃいけないかって言うと、そうしなくちゃいけないからです笑 pythonを作ったグイド・ヴァンロッサムさんっていう人がいるんですが、「グイドさんに、なんでself書かなくちゃあかんの?って聞いてもあんまりよくわからんかった」っていう記事を見たことがあります笑「世の中そういうもんだ」と思って書いてください笑
# ゲームを開始するメソッド
def playGame(self,):
if game in self.saved_game:
game.play()
# インターネットに接続するメソッド
def internet(self, wifi_id, wifi_password):
if wifi_id and wifi_password:
internet.connect()
# チャットをするメソッド
def chat(self, friend, message):
message.sendToFriend()
# ゲーム追加(購入)のメソッド
def purchaseGame(self, game):
self.saved_game.append(game)
④インスタンス化
インスタンスとは、設計図(クラス)を見ながら、実際に作ったもの=製品のことをいいます。ここでは,my_switchという名前にしています。
my_switch = Switch(800, 600, 20, "blue", "red", 420)
さて、製品ができたので、製品のメンバーにどういうデータが入っているか確認したり、備わっている機能=メソッドを実行しましょう。
my_switch.playGame()
てなかんじです。
なんかめんどくさ!普通に関数だけでいいじゃん!
リッキーもはるか昔、クラスを勉強したてのときにそう思いました!でも、このクラスって 実際に使えるようになるとすごく便利というか、このクラスの考え方がすごく重要なんです。
今回出てきた用語を整理しましょう。
クラス:設計図
メンバー:クラスに必要なデータ
メソッド:機能
インスタンス:クラスをもとに作成されたもの
クラスを使えるようになると、ベースとなるクラスにメソッドを付け加えたり、改良したりすることができるんですが、まずは今回はここまで。次回、実際に動くコードでやってみましょう。
ではまた来週!