【progate復習】Python Ⅳ （随時更新）

Python学習コースⅣで理解が追い付かなかったので
復習しながら学習メモを残します。
同じコードだとつまらないし覚えられないので
大好きな「CLOCK ZERO～終焉の一秒～」のゲームネタを交えながら書いていきます。
ネタバレ注意。

---

**クラスを作成する**


クラスは<font color=#ff0000>「class クラス名:」</font>で定義する
クラス名は大文字で始める

```py:
class CZmember:
```

クラスで何も処理がないときはpassと書く
インデントをそろえる

```py:
class CZmember:
  pass
```
処理がない、つまりはまだ2010年の秋より前ってことでしょうねー。

<BR>

**クラスからインスタンスを生成する**


「クラス()」とそのクラスを呼び出すことで新しく<font color=#ff0000>インスタンス</font>を生成できる
「変数名=クラス()」で生成したクラスを変数に代入できる

空のクラスを生成

```py:
class CZmember:
   pass

cz_member1 = CZmember()
```

<BR>

**インスタンスに情報を追加**

今回はCZメンバーの名前と年齢にしましょう。

```py:
class CZmember:
   pass

#インスタンスを作成
cz_member1 = CZmember()

#インスタンスに情報を追加
cz_member1.name = 'Takato'
cz_member1.age  = 12

print(cz_member1.name + 'は' + str(cz_member1.age) + 歳です)
```
> Takatoは12歳です

この「name」や「age」の部分をインスタンス変数という
攻略対象が小学生のゲームってなんなんですかねー。



メンバーもさくっと追加しちゃいましょー

```py:
class CZmember:
   pass

cz_member0 = CZmember()
cz_member0.name = 'Nadeshiko'
cz_member0.age  = 12

cz_member1 = CZmember()
cz_member1.name = 'Takato'
cz_member1.age  = 12

cz_member2 = CZmember()
cz_member2.name = 'Riichiro'
cz_member2.age  = 11
```
メンバー7人いるのにわざわざこんなに書くのめんどくさいな。
なのであとで出てくる項目で追加しましょう。

<BR>

**クラスの中に処理を追加する**

クラスの中には関数を定義することができる
この関数のことを<font color=#ff0000>メソッド</font>と呼ぶ
第1引数には必ず<font color=$FF0000>self</font>を追加する

```py:
class CZmember():
   def info(self):
      print('CZメンバーの名前と年齢が表示されます')
```




<BR>
**クラスの中で定義したメソッドを呼び出す**
メソッドの呼び出しは「<font color=$FF0000>インスタンス.メソッド名()</font>」でできる

```py:
class CZmember():
   def info(self):
      print('CZメンバーの名前と年齢が表示されます')

cz_member0 = CZmember()
cz_member0.name = 'Nadeshiko'
cz_member0.age = 12

cz_member0.info()


cz_member1 = CZmember()
cz_member1.name = 'Takato'
cz_member1.age = 12

cz_member1.info()

cz_member2 = CZmember()
cz_member2.name = 'Riichiro'
cz_member2.age = 11

cz_member2.info()
```
>CZメンバーの名前と年齢が表示されます
>CZメンバーの名前と年齢が表示されます
>CZメンバーの名前と年齢が表示されます

クラスの中で定義し、インスタンスについて呼び出すメソッドのことを
<font color=$FF0000>インスタンスメソッド</font>という

<BR>

**インスタンスメソッドの正体**

インスタンスメソッドの第1引数であるselfには、そのメソッドを呼び出したインスタンス自身が代入されている


```py:
class CZmember():
   def info(self):
      print(self.name)

cz_member0 = CZmember()
cz_member0.name = 'Nadeshiko'
cz_member0.age = 12

cz_member0.info()
```
↑だと、
cz_member0.info()　とすることで
self = cz_member0
となっている

つまり、メソッド内でself.name にすると
cz_member0.nameということになる。


```py:
class CZmember():
   def info(self):
      print(self.name)        #selfの部分に呼び出したインスタンスが代入される

cz_member0 = CZmember()
cz_member0.name = 'Nadeshiko'
cz_member0.age = 12

cz_member0.info()　　        　#print(cz_member0.name)が返される


cz_member1 = CZmember()
cz_member1.name = 'Takato'
cz_member1.age = 12

cz_member1.info()　　        　#print(cz_member1.name)が返される

cz_member2 = CZmember()
cz_member2.name = 'Riichiro'
cz_member2.age = 11

cz_member2.info()　　        　#print(cz_member2.name)が返される
```
>Nadeshiko
>Takato
>Riichiro

これを利用して、メンバーの名前と年齢を出力してみる

```py:
class CZmember():
   def info(self):
      print(self.name + 'は' + str(self.age) + '歳です')

cz_member0 = CZmember()
cz_member0.name = 'Nadeshiko'
cz_member0.age = 12

cz_member0.info()


cz_member1 = CZmember()
cz_member1.name = 'Takato'
cz_member1.age = 12

cz_member1.info()

cz_member2 = CZmember()
cz_member2.name = 'Riichiro'
cz_member2.age = 11

cz_member2.info()
```
>Nadeshikoは12歳です
>Takatoは12歳です
>Riichiroは11歳です


<BR>

また戻り値として返すこともできる

```py:
class CZmember():
   def info(self):
      #return の時はかっこではくくらない
      return self.name + 'は' + str(self.age) + '歳です'

cz_member0 = CZmember()
cz_member0.name = 'Nadeshiko'
cz_member0.age = 12
#値が戻って来るだけなので、出力するときにはprintをする
print (cz_member0.info())

cz_member1 = CZmember()
cz_member1.name = 'Takato'
cz_member1.age = 12

print (cz_member1.info())

cz_member2 = CZmember()
cz_member2.name = 'Riichiro'
cz_member2.age = 11

print (cz_member2.info())
```

>Nadeshikoは12歳です
>Takatoは12歳です
>Riichiroは11歳です

<BR><BR>

**インスタンスメソッドのまとめ**

2020年(10年後)の彼らの年齢を求めるための
インスタンスメソッドを追加する

```py:
class CZmember():
   def info(self):
      #return の時はかっこではくくらない
      return self.name + 'は' + str(self.age) + '歳です'

   def age_y2020(self, year):
      after_age = self.age + year
      return after_age

cz_member0 = CZmember()
cz_member0.name = 'Nadeshiko'
cz_member0.age = 12

y = 10
result = cz_member0.age_y2020(y)
print (str(y) + '年後' + cz_member0.name + 'は'  + str(result) + '歳です')
```
>10年後Nadeshikoは22歳です

<BR><BR>
**\_\_init\_\_メソッド**

「クラス()」でインスタンスを生成した直後に自動で呼び出される

```py:
class CZmember:

   def __init__(self):
      print ('新しいCZメンバーが増えました')

   def info(self):
      return self.name + 'は' + str(self.age) + '歳です'

cz_member0 = CZmember()
cz_member0.name = 'Nadeshiko'
cz_member0.age  = 12

print (cz_member0.info())

cz_member1 = CZmember()
cz_member1.name = 'Takato'
cz_member1.age  = 12

print (cz_member1.info())

cz_member2 = CZmember()
cz_member2.name = 'Riichiro'
cz_member2.age  = 11

```
>新しいCZメンバーが増えました
>Nadeshikoは12歳です
>新しいCZメンバーが増えました
>Takatoは12歳です
>新しいCZメンバーが増えました

最後にprintをしていないので、理一郎の情報は表示されないが、
インスタンスは追加したので、
自動で呼び出される\_\_init\_\_メソッドの「新しいCZメンバーが増えました」というメッセージは表示される
<BR>

**\_\_init\_\_メソッドで変数を扱う**

インスタンス生成直後にインスタンス変数に値を代入する

```py:
class CZmember():
   def __init__(self):
      self.name = 'Toranosuke'
      sel.age   = 12

cz_member3 = CZmember()
print (cz_member3.name)
print (cz_member3.age)
```
>Toranosuke
>12

でもこれだと全部同じ値になってしまうのでは？


**\_\_init\_\_メソッドに引数を渡す**

```py:
class CZmember():
   def __init__(self,name)
      self.name = name
cz_member3 = CZmember(Toranosuke)
print (cz_member3.name)
```
>Toranosuke

<BR>

引数は複数渡すこともできる

```py:
class CZmember():
   def __init__(self,name,age)
       self.name = name
       self.age = age
cz_member3 = CZmember(Toranosuke,12)   #インスタンス生成、名前と年齢の設定がこの1行でできる
print (cz_member3.name)
print (cz_member3.age)
```
>Toranosuke
>12




（続きは随時更新）


---
「CLOCK ZERO～終焉の一秒～」
Switchでも発売されているゲームでめっちゃ泣けるので
気になる方はぜひプレイしてみてください。