悟空みたいな初級がPYTHONのクラスClassを吉本君を通じて10分で理解させる

オス。おら初級。PYTHONのクラス概念がよくわかんねぇんだ。上司にも部下にも聞けねぇ。恥ずかしくておらのボルトもチチも揉めねぇ。そんなおめぇらにすぐPYTHONのクラス概念を10分で理解させっからぜってぇ見てくれよな！インスタンスとかメゾットとか難しい話はよくわからねーぞ！だからまず「簡単な平均プログラム」を５STEPに分けてみた。5stepそこは天下一クラス会だ。逝くぜ！

# ステップ１　まず書く　
目的：大阪に吉君と本君というアホが2人いてテスト平均点を出す。(ステップ５まで全部一緒)

```
a = '吉'
b = 20 #面白さの点数
c = 5 #常識の点数
d = (b + c) / 2
 
e = '本'
f = 20 #面白さの点数
g = 10 #常識の点数
h = (f + g) / 2
 
print(a, 'の平均点：', d)
print(e, 'の平均点：', h)
```

初級の所感
これじゃあbやfがなんだか後でみたらさっぱりわからねぇぞ。チチ次はパイズ...おっとまちげぇたステップ２で変数を使用しよう。変数名の使用方法がわかるならステップ３だ。

# ステップ２　変数名を使う

```
yoshi_name = '吉'
yoshi_hilarious = 20 #面白さの点数
yoshi_commonsence = 5 #常識の点数
yoshi_average = (b + c) / 2
 
hon_name = '本'
hon_hilarious = 20 #面白さの点数
hon_commonsence = 10 #常識の点数
hon_average = (f + g) / 2
 
print(yoshi_name, 'の平均点：', yoshi_average)
print(hon_name, 'の平均点：', hon_average)
```

初級の所感
ステップ１よりだいぶみやすくなったけど、nameとかhilariousとか変数が重複してる箇所があるじぇねぇか。それにクラスには吉と本以外にだって黒ざっき君や黒シミーズ君や岡本など友達が沢山いるんだぞ？友達の名前のたんびにokamoto__hilariusとか変数作るのなんだか面倒くせっぞ。チチ次はイマラ...おっとまちげぇたステップ３で関数を使う。関数の意味がわかっているならばステップ４だ。

# ステップ３　def関数を使う
```
def average(hilarious, commonsence): #追加した
    return (hilarious + commonsence) / 2 #追加した
 
yoshi_name = '吉'
yoshi_hilarious = 20 #面白さの点数
yoshi_commonsence = 5 #常識の点数
yoshi_average = average(yoshi_hilarious, yoshi_commonsence)

hon_name = '吉'
hon_hilarious = 20 #面白さの点数
hon_commonsence = 10 #常識の点数
hon_average = average(hon_hilarious, hon_commonsence)
 
print(yoshi_name, 'の平均点：', yoshi_average)
print(hon_name, 'の平均点：', hon_average)
```

初級の所感
うおおおお。def関数かなり便利だよな。関数の中身は平均値計算は1行　hilarious + commonsence) / 2　で済む。すっげぇ便利だ。でもさ、共分散からばらつきを求める時もdef関数を使うのか？どこから平均でどこから共分散でどこからばらつきの差分でどこからplotして描画するのかわかりずらくて書くのが面倒くせっぞ！それに実際の関数は1行じゃないよな。しかも前回指摘した変数名重複も全然直ってねぇじゃねぇか！前ステップでの発言を自分の胸に手を当ててよく考えてみろ！チク次はチチ...おっと前後まちげぇたニーチクだ。

# ステップ４　いよいよClassクラス　構造体(変数定義など)

```
def average(hilarious, commonsence):
    return (hilarious + commonsence) / 2

class TokutenData:
    def __init__(self):
        self.name = ''
        self.hilarious = 0
        self.commonsence = 0
        self.average = 0.0

yoshi = TokutenData()
yoshi.name = '吉'
yoshi.hilarious = 20 #面白さの点数
yoshi.commonsence = 5 #常識の点数

hon = TokutenData()
hon.name = '吉'
hon.hilarious = 20 #面白さの点数
hon.commonsence = 10 #常識の点数

yoshi.average = average(yoshi.hilarious,yoshi.commonsence)
hon.average = average(hon.hilarious,hon.commonsence)

print(yoshi.name, 'の平均点：', yoshi.average)
print(hon.name, 'の平均点：', hon.average)
```

初級の所感
なんだクラスってすっげぇ便利じゃねぇか。とにかく困ったときは「TokutenData()ーー」って叫んで＝で入れちゃうのか。たったそれだけで定義変数が全部使えんのかよ！じゃ後は岡本とかを okamoto = TokutenData() って宣言するだけで
okamoto.name
okamoto.hilarious
okamoto.commonsence
全部使えちゃうのか。重複した変数書く必要全然ねぇじゃねぇか。

「おい初級。それはClass本来の使い方じゃないのよ？次のステップへい....」
それとdef __init__(self):がよくわかんねぇぞ？

「おい初級。以下に非常に丁寧な回答がありますよ」
https://qiita.com/ishigen/items/2d8b6e6398743f2c8110

チチ次はラストステップ５だ。あっと言う間だったが既に変数と関数とクラスの違いはわかっているはずだ。ステップ５では関数をクラスの中に入れてしまうぜ

# ステップ５　Class　def関数もクラスの中へ入れる

```
class TokutenData:
    def __init__(self):
        self.name = ''
        self.hilarious = 0
        self.commonsence = 0
        self.average = 0.0

    #戻り値なし
    def average_cal(self):
        self.average = (self.hilarious + self.commonsence) / 2

    #戻り値あり
    def payment(self,count):
        total_price = self.capprice * count
        return total_price #戻り値に合計金額を設定

yoshi = TokutenData()
yoshi.name = '吉'
yoshi.hilarious = 20 #面白さの点数
yoshi.commonsence = 5 #常識の点数
yoshi.average_cal()  #これを追加した！！！！！

#第2引数のcountに、4個かった帽子を代入する
yoshi.capprice = 50
result = yoshi.payment(4)
print(yoshi.name+"は帽子を買いました。合計"+str(result)+円です)

hon = TokutenData()
hon.name = '吉'
hon.hilarious = 20 #面白さの点数
hon.commonsence = 10 #常識の点数
hon.average_cal()  #これを追加した！！！！！

#第2引数のcountに、10個かった帽子を代入する
hon.capprice = 70
result = hon.payment(10)
print(hon.name+"は帽子を買いました。合計"+str(result)+円です)

yoshi.average = average(yoshi.hilarious,yoshi.commonsence)
hon.average = average(hon.hilarious,hon.commonsence)

print(yoshi.name, 'の平均点：', yoshi.average)
print(hon.name, 'の平均点：', hon.average)
```

初級の所感

えええ。yoshi.average_cal()って宣言すればいいだけ？最初に
okamoto = TokutenData() って宣言すれば　---①
okamoto.average_cal()　って関数を呼ぶ事ができるんか。　---②

すっげぇ便利じぇねぇか

インスタンスとは？
TokutenDataの構造体や関数をokamotoに入れたろ？
okamotoの事をインスタンスっていうんだ。①の事だよ。
okamoto.nameの事はインスタンス変数名っていうんだ。

メソッドとは？
クラスの中で定義された関数つまり上で言う②のことをメソッドというんだ。
メソッドの定義の方法は通常の関数と同じだが第1引数にselfを使う。これは決まりだ。






本当はデコレータとか説明した　ん？なに？self.の意味がわからない、だと？お前たちは自分でする事は得意だろ？クラスの中のコンストラクタやメソッドには、selfというものがあるんだ。このselfは、インスタンス自身を示すものでpythonの設計仕様で欠かすことはできない。名前を"self"以外のキーワード(例えばmyselfなど)にすることは可能だが慣例としてselfを使用している。pythonでは作成されたコードを後から読む人がどのように実装されているかが一目でわかるように書く事が重要だ。基本的には"self"とするのが良い。

今日も異常だ。いや、今日は以上だ。