（中学生向け・Python）クラスの基本①

この記事は、岩手県八幡平市のプログラミング教室「アクセルキャンプ」の公開教材です。
[アクセルキャンプ(フリースペースプラウド)のリンク](https://freespaceproud.com)
教材の作成依頼等も承っております。ご意見等は、リンク先の問い合わせ欄からお願いします。
教材の転用・利用等は自由です  
***


# 安比のスキー場のシーズン券買っちゃったんだが  
スキー一回もしたことないんだけど大丈夫かな？ていうか、いつ滑るねん！そこまで暇やないねん！ってなってるリッキーです。  
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732489/3775540e-2ee9-18ad-f5ef-4f1d76c1a5b7.png)

ほな、なんでこうたん？てことですけど、買ったときはなんかテンション上がって、「今年はスキー頑張るぜ！」みたいになってたんですよ。皆さんは今年の冬はなにかこれをやろう！みたいなの決めてますか？サンタさんにお願いするものは決めてますか？  

# 先に言っときます！！(ｷﾘｯ)
今日やる内容ですが、コードを書いてればある程度は理解できるとは思いますが、「なんでコレが必要なの？」っていうのがなかなか伝わりにくい内容になってます。  
例えるなら、お金でしょうか。「お金ってなんで必要なの？物と物を交換すればよくない？」って幼稚園児に聞かれて、しっかり説明するのって難しいけど、でもお金って超大事ですよね？？  
なるべくその辺をわかりやすく説明するつもりですが、「なんとなくわからんでもないけど、あとは使いながら覚えていこう」ていう理解でいいと思います。そんな感じで気楽に読んでくださいね！！  
  
# 今日の主役:クラス (class)
みなさんは「クラス」という単語を聞いて、どういう意味を思い浮かべますか？真っ先に思いつくのが、学校の教室のことだと思います。八幡平では1学年に2クラスある小学校は一部の学校だけで、殆どは1学年1クラス、あるいは、複式学級のところもあったかもしれません。中学校はどうなんでしょう。そういう学校での人の **まとまり**のことを「クラス」といいますよね。    

ただ、残念ながら(？)プログラミングにおいてはちょっと意味が変わってくるので一旦「クラス」の意味を整理しましょう。以後、クラスのことをclassと表記します。  
### class = データの設計図  
みんな大好き、Nintendo Switchを作るプログラムを書いていくとしましょう。実際にSwitchをプログラムでポンと制作することはできないので、あくまで仮定の話です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2732489/09609981-9500-f6b1-1bf1-264e0aa0d1b9.png)

  

##### メンバーとメソッド
Switchを作るためには、いろんなデータが必要になります、例えば
・画面の縦・横の長さ  
・ボタンの大きさ   
・左コントローラの色  
・右コントローラの色  
・重さ

などなどです。これらの、Switchを作る際に登録する必要のあるデータを「**メンバー**」または、これらはクラスでは変数として扱われるため「**メンバ変数**」といいます。  
  
また、Switchを作る際に、用意したデータを組み合わせたりして、いろんな機能をつけたりします。例えば
・ゲームを遊ぶ機能  
・インターネットに接続する機能  
・友達とチャットする機能  
・購入したゲームを保存する機能  
これらのことを**メソッド**といいます。メソッドはその性質から、処理をまとめた関数として扱われます。  
  
Switch を作るクラスは、プログラム上では以下のようになります。なんとなく、コードっぽいものを書いているだけなので、当然このコードは動きません  
```python
#①クラスの書き方
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です。  
  
では、順番に見ていきましょう。

# クラスの構造
### ①クラスの書き方
```python
class クラス名:
    def __init__(self, 引数1、引数2):
        self.メンバー1 = 引数1
        self.メンバー2 = 引数2
        ...
    
    def メソッド名(self):
        処理

```  
### ②初期化:コンストラクタ
Switchをいざ作ろう！というときに、  
switch設計するぜ → switchの色わかんないぜ → switch製造するぜ  
では困りますよね。そこで、  
switch設計するぜ → switchの色は赤にするぜ → switch製造するぜ  
のように、必要なデータ(メンバー)を整理するのに使うのが、この__init__の関数で、これのことを「コンストラクタ」と言います。  
```python
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書かなくちゃあかんの？って聞いてもあんまりよくわからんかった」っていう記事を見たことがあります笑「世の中そういうもんだ」と思って書いてください笑  

```python
# ゲームを開始するメソッド
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という名前にしています。
```python
my_switch = Switch(800, 600, 20, "blue", "red", 420)
```  
さて、製品ができたので、製品のメンバーにどういうデータが入っているか確認したり、備わっている機能=メソッドを実行しましょう。
```python
my_switch.playGame()
```  
てなかんじです。  
***
# なんかめんどくさ！普通に関数だけでいいじゃん！
リッキーもはるか昔、クラスを勉強したてのときにそう思いました！でも、このクラスって 実際に使えるようになるとすごく便利というか、このクラスの考え方がすごく重要なんです。  
  
 
  
今回出てきた用語を整理しましょう。  

>クラス:設計図  
> メンバー:クラスに必要なデータ  
> メソッド:機能  
> インスタンス:クラスをもとに作成されたもの

クラスを使えるようになると、ベースとなるクラスにメソッドを付け加えたり、改良したりすることができるんですが、まずは今回はここまで。次回、実際に動くコードでやってみましょう。  
  
ではまた来週！