Pythonのクラス学習。挫折からリベンジする話。

## 初めに。
どうもpython歴3か月の者です。
今回は一度学習して理解できずにスルーしていたクラスについてリベンジしたいと思います。
初回に学習した時より理解できたのでその忘備録やアウトプットに。
自分はクラスの理解に苦労したので、このような方に少しでも楽になればと。

[次回記事できました](https://qiita.com/The_Boys/items/7c4a04c1412c79c220ef)。継承やオブジェクト指向について触れています。

- 出力結果表示の際にf文字列を使用しております。


## 今回扱う参照コード

このようなコードの理解を深めていきます。なんとなくニュアンスで分かるかもしれませんが、ある程度しっかり把握する事を目標と致します。


```python
class Student:                                #クラスの定義

    def __init__(self,name,math,english):     #コンストラクタ(初期化)メソッド。
        self.name = name                      #アトリビュートの設定
        self.math = math                      #アトリビュートの設定
        self.english = english                #アトリビュートの設定
    
    def avg(self):                            #avgメソッド
        return (self.name+"さんの平均点は"+  str((self.math + self.english)/2))

a001 = Student("sato",50,70)    #インスタンスとアトリビュート(変数)の代入。クラス呼出(実行)
a002 = Student("tanaka",40,90)
a003 = Student("yamakawa",50,60)

print(f"{a001.avg()}\n{a002.avg()}\n{a003.avg()}")
print()

print(f"{a001.name}の数学は{a001.math},英語は{a001.english}")
print(f"{a002.name}の数学は{a002.math},英語は{a002.english}")
print(f"{a003.name}の数学は{a003.math},英語は{a003.english}")
```
出力結果

```tex
satoさんの平均点は60.0
tanakaさんの平均点は65.0
yamakawaさんの平均点は55.0

satoの数学は50,英語は70
tanakaの数学は40,英語は90
yamakawaの数学は50,英語は60
```

## 用語確認
最初に用語をある程度把握していると楽になるかと。初見で理解できなくても平気です。
なんとなくで。忘れた時にこのページに戻って頂ければ。



<details><summary>クラス</summary><div>


データと処理をまとめたもの。それぞれ別名があり、以降はそれで呼びます。
データ：<font color="red">**アトリビュート**</font>　　処理：<font color="red">**メソッド**</font>
クラスにはアトリビュートとメソッドにて構成されております。

参照コードの場合はこの部分全体の事です。

```python
class Student:                                

    def __init__(self,name,math,english):     
        self.name = name
        self.math = math                      
        self.english = english                
    
    def avg(self):                            
        return (self.name+"さんの平均点は"+  str((self.math + self.english)/2))
```
</div></details>


<details><summary>アトリビュート</summary><div>
クラス内のデータ。つまり<font color="red">クラス内で定義された変数</font>。
通常変数との違いは､クラスの外にあるか中にあるか。　それを意識して頂ければと。


```python
self.name = name 
self.math = math 
self.english = english 
```
この部分でアトリビュート設定をしています。

</div></details>



<details><summary>メソッド</summary><div>
クラス内の処理の事です。<font color="red">class内でdefから始まります</font>。

通常の関数との違いは**第一引数の指定**がある。という事です。<font color="red">self</font>の部分です。
関数では渡したい引数がない場合は空欄でも結構ですがクラスでは**必ず第一引数が必要**です。
その引数はなんでも良いのですが、慣習的に<font color="red">self</font>となっています。

:::note info
私もここのselfが良く分からずにクラス理解をリタイアしました。
:::

具体例
```python
def __init__(self,name,math,english):
        self.name = name
        self.math = math
        self.english = english
```

```python
def avg(self):
        return (self.name+"さんの平均点は"+  str((self.math + self.english)/2))
```
ここで疑問が湧いてきますよね。
- <font color="red">強制的第一引数self</font>とは？その役割は？なんで必要なの？
ひとまずここは、こーゆーものだと覚えて頂ければ。
プログラミングを学ぶ上でシステムに対する割り切りの良さも重要な要素の一つです。(by学習歴3ケ月)


</div></details>


<details><summary>インスタンス化</summary><div>
別名｢オブジェクト化｣｢オブジェクト生成｣とも。

:::note info
人やサイトにより言い方が違うのは混乱しますよね。自分の流儀以外もストックに入れておきましょう。
:::

先ほどのクラス、実はクラス単体では使用する事はできません。
<font color="red">クラスを使用できる状態に処置する動作</font>が必要です。
これこそ**インスタンス化**です。

他の説明としてよく
- クラスという**設計図、たい焼きの型**から、実際に使えるモノ(**実体化、設計図から車、たい焼きの型からたい焼き**)を作る.

という例も見ますよね。私は正直ピンと来ませんでした…。

#### 具体例
参照コードでいうこの部分です。

```python
a001 = Student("sato",50,70)
```

ひとまずこのようなコードで確認してください。

```python
a001 = Student()
```
いかがでしょうか？これはクラス(Student)そのものを変数に格納しています。
この動作が<font color="red">インスタンス化</font>といいます。
こうすることでクラスを使う事が出来ます。

もう一つ大事なポイントとして
- クラスを作成したその数だけ、アトリビュート(変数)も作成しなければなりません。

インスタンス毎にアトリビュートを定義する。⇒とても<font color="red">面倒</font>です。

</div></details>


<details><summary>コンストラクタ</summary><div>
この｢インスタンス毎にアトリビュートを定義する。｣この煩わしさ、<font color="red">コンストラクタ</font>で省略可能です。

コンストラクタ：意味：初期化。新しいインスタンスを作成するごとにアトリビュート定義を自動的に行う**メソッド**。

参照コードもコンストラクタを設定しております。この部分です。(コメントも残しておきます｡)

```python
def __init__(self,name,math,english):     #コンストラクタ(初期化)メソッド。
    self.name = name                      #アトリビュートの設定
    self.math = math                      #アトリビュートの設定
    self.english = english                #アトリビュートの設定
```

メソッドなので、**第一引数にself**

:::note info
コンストラクタ=アトリビュート(変数)自動作成メソッド(関数)
:::

ピンとこないと思うので、コンストラクタ無しの場合どうなるかコードにて紹介致します。


```python
class Student:                                #クラスの定義
    def avg(self):                            #avgメソッド
        return (self.name+"さんの平均点は"+  str((self.math + self.english)/2))


a001 = Student()           #インスタンス化
a001.name    = "tanaka"    #アトリビュート作成
a001.math    = 50          #アトリビュート作成
a001.english = 70          #アトリビュート作成


print(a001.avg())
print()

print(f"{a001.name}の数学は{a001.math},英語は{a001.english}")
```
面倒臭いのでtanakaさん一人のみです…。
この見慣れない`__init__`というのは楽する為の自動装置。とひとまず考えて頂ければ。


</div></details>



## コードの流れ

①赤⇒②黄緑⇒③青　　と実行されていきます。


![2022-07-30_15h36_58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2719278/f1ab07c1-05db-790b-5eb7-0369c0bc3770.png)

参照コード
```python
class Student:

    def __init__(self,name,math,english):
        self.name = name
        self.math = math
        self.english = english
    
    def avg(self):
        return (self.name+"さんの平均点は"+  str((self.math + self.english)/2))

a001 = Student("sato",50,70)    
a002 = Student("tanaka",40,90)
a003 = Student("yamakawa",50,60)

print(f"{a001.avg()}\n{a002.avg()}\n{a003.avg()}")
print()

print(f"{a001.name}の数学は{a001.math},英語は{a001.english}")
print(f"{a002.name}の数学は{a002.math},英語は{a002.english}")
print(f"{a003.name}の数学は{a003.math},英語は{a003.english}")
```

## クラスの特徴
クラスの利点を紹介致します。ズバリ

<font color="red">self.xxxx(変数名)に保存したデータを上書きせずに、保持する事が可能です。</font>

```python
print(a001.name)  #⇒sato
print(a002.name)  #⇒tanaka
print(a003.name)  #⇒yamakawa
```
このように`name`という変数に複数のデータが格納されています。
通常変数というものは上書きされますよね。クラスの変数(アトリビュート)は違うのです。

このクラスの特徴を使いこなすことで、下記の部分実装時に、<font color="red">不要な引数なしに、保持している変数を使って処理を実行</font>する事が可能です。
```python
 def avg(self):
        return (self.name+"さんの平均点は"+  str((self.math + self.english)/2))
```


## 終わりに
いかがでしたか？
クラスの理解は難しいみたいです。いろんな方がおっしゃっていました。
私もまだまだクラスについて勉強途中なので随時更新していく予定です。
何か間違っている箇所等ありましたら教えて頂ければ幸いです。

[次回記事はこちら](https://qiita.com/The_Boys/items/7c4a04c1412c79c220ef)。継承やオブジェクト指向について触れています。

## 参照

https://www.youtube.com/watch?v=F5guF1y7G48