超初心者向け Pythonコードの書き方 パイソンの基礎を学ぶ 4

# クラスとインスタンス

## クラスの定義
プログラミングでメニューという`もの`を生成するには、まずその`設計図`を用意する必要がある。
`設計図`のことを`クラス`、`もの`のことを`インスタンス`と呼ぶ。
インスタンスを生成する流れは、❶クラスを用意する　❷クラスからインスタンスを生成する　❸インスタンスに情報を追加する

### 01. クラスを用意する
クラスは`class クラス名:`とすることで定義できる。
また、クラス名は`MenuItem`のように大文字で始める。

```python:例
class MenuItem:
```
クラスの中身（設計図の内容）は`class MenuItem:`より後の行で、インデントをして書く。
これは何も処理がない場合は、`pass`と書く。

```python:例
class MenuItem:
    pass
```
## インスタンスの生成
### 02. クラスからインスタンスを生成する
`クラス名()`でそのクラスを呼び出すことで、クラス（設計図）を用いて新しくインスタンスを生成することができる。
`変数名 = クラス名()`とすることで、生成したインスタンスを変数に代入することができる。

```python:例
class MenuItem:
    pass

menu_item1 = MenuItem()
```
## インスタンス変数
### 03. インスタンスに情報を追加する
それぞれのインスタンス（メニュー）には、自由に様々な情報を追加することができる。
`menu_item1.name = 'サンドイッチ'`とすることで、`menu_item1`に`name`が`サンドイッチ`であるという情報を追加することができる。この`name`のことを`インスタンス変数`と呼ぶ。

```python:例
class MenuItem:
    pass

menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
```

`インスタンス.インスタンス変数名`とすることで、そのインスタンス変数の値を用いることができる。

```python:例
class MenuItem:
    pass

menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
print(menu_ietm1.name)
```
```text:出力結果
サンドイッチ
```

## 複数のインスタンス

```python:例
class MenuItem:
    pass

menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
menu_item1.price = 500
print(menu_ietm1.name)
print(menu_item1.price)

menu_item1 = MenuItem()
menu_item1.name = 'チョコケーキ'
menu_item1.price = 400
print(menu_ietm1.name)
print(menu_item1.price)


```
```text:出力結果
サンドイッチ
500
チョコケーキ
400
```

# インスタンスメソッド
## クラスとメソッド

クラスの中では関数を定義することができる。クラスの中で定義した関数のことを`メソッド`と呼ぶ。
メソッドの定義の方法は通常の関数と同じだが、第1引数に`self`を追加する必要がある。

```python:例
class MenuItem:
    def hello(self)
        print('こんにちは！')
```

クラスの中で定義したメソッドは、インスタンスに対して使うように呼び出す。`インスタンス.メソッド名()`とすることで、メソッドを呼び出す。

```python:例
class MenuItem:
    def hello(self):
        print('こんにちは！')

menu_item1 = MenuItem()
menu_item1.hello()
```
```text:出力結果
こんにちは！
```
## インスタンスメソッド（self）
インスタンスメソッドの第1引数に指定した`self`には、そのメソッドを呼び出したインスタンス自身が代入されている。
そのため、メソッド内で`self.name`とすることで、そのメソッドを呼び出している`menu_item1`の`name`の値を取得することができる。

```python:例
class MenuItem:
    def info(self):
        print(self.name)

menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
menu_item1.info()
```
```text:出力結果
サンドイッチ
```
`name`と`price`の値を用いて、「サンドイッチ: ¥500」と出力する時、`price`の値は数値型であるため、文字列と結合するためには文字列型に変換する必要がある。
```python:例
class MenuItem:
    def info(self):
        print(self.name + ': ¥' + str(self.price))


menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
menu_item1.price = 500

menu_item1.info()

menu_item2 = MenuItem()
menu_item2.name = 'チョコケーキ'
menu_item2.price = 400

menu_item2.info()
```
```text:出力結果
サンドイッチ: ¥500
チョコケーキ: ¥400
```

## インスタンスメソッド（戻り値）
インスタンスメソッドは通常の関数と同様に、戻り値を返すようにすることもできる。

```python:例
class MenuItem:
    def info(self):
        return self.name + ': ¥' + str(self.price)


menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
menu_item1.price = 500

print(menu_item1.info())

menu_item2 = MenuItem()
menu_item2.name = 'チョコケーキ'
menu_item2.price = 400

print(menu_item2.info())
```
```text:出力結果
サンドイッチ: ¥500
チョコケーキ: ¥400
```
## インスタンスメソッド（引数）
インスタンスメソッドに引数を渡す場合、メソッドの定義側では`self`の分だけ引数の順番がずれる。

```python:例
class MenuItem:
    def info(self):
        return self.name + ': ¥' + str(self.price)

    def get_total_price(self, count):
      total_price = self.price * count
      return total_price


menu_item1 = MenuItem()
menu_item1.name = 'サンドイッチ'
menu_item1.price = 500

print(menu_item1.info())

result = menu_item1.get_total_price(4)

print('合計は' + str(result) + '円です')
```
```text:出力結果
サンドイッチ: ¥500
合計は2000円です
```
__init__メソッド（1）
__init__メソッド（2）
__init__メソッド（3）


編集中です。