Paiza Python入門編8 : クラスを理解しよう

PaizaでPython3が完全無料なのでまとめました。

[Paiza Python3入門編](https://paiza.jp/works/python3/primer)


## 01:クラスを理解しよう

### オブジェクトとは

簡単に言えば、変数と関数をセットしたもの

Playerオブジェクト

- 変数

```
名前="paiza"
職業="魔法使い"
体力="120"
```

- 関数

```
攻撃処理()
移動処理()
```

オブジェクトにまとめられている関数→メソッド

### オブジェクトの使い方

- クラスからオブジェクトを作って利用
- クラス:オブジェクトの設計図
- オブジェクト:クラスから生成する

Plyaerクラス

```
name
attack()
```

Plyaerクラスから、Plyaerオブジェクトを生成

```
name="paiza"
attack()

name="python"
attack()

name="dragon"
attack()
```


クラスから作成したオブジェクトのことをインスタンスという

### オブジェクトのメリット

- 変数とメソッドがセット

バグが出にくい

- クラスとオブジェクトに分離

再利用しやすい
分類しやすい
↓
多数のライブラリ/フレームワークがクラスをベースに作られている

## 02:クラスを作成しよう

```lesson.py
#クラス名の先頭は大文字にする
#１.クラスでクラス名前Plyaerを指定
class Plyaer:
    #2.クラスが持つメソッド(関数を記述)
    def walk(self):
        print("勇者は荒野を歩いていた")

#3.クラス名を使ってオブジェクトを作る
#作ったオブジェクトは変数に代入しておこう
plyaer1=Plyaer()
#変数名.メソッド名で作成したオブジェクトを呼び出すこともできる
plyaer1.walk()

#変数にオブジェクトを代入することもできる

#クラス
class Player:

#プロパティやメソッド

    def walk(self):
        print("勇者は荒野を歩いていた")

    #メソッド増やした
    def attack(self, enemy):
        print("勇者は" + enemy + "を攻撃した")

#オブジェクト
player1=Player()
player1.walk()
player1.attack("スライム")

勇者は荒野を歩いていた
勇者はスライムを攻撃した

#オブジェクトとは、クラスのメソッドやプロパティをまとめたもの
```


## 演習

1.クラスからオブジェクトを作成しよう

```lesson.py

class Greeting:
    def say_hello(self):
        print("hello paiza")

# この下に、必要なコードを追加してください
greeting=Greeting()
greeting.say_hello()

```

2.クラスにメソッドを定義しよう

class Plyaer:

```lesson.py

class Greeting:
    # この下に、必要なコードを追加してください
    def say_hello(self):
        print("hello python")

paiza = Greeting()
paiza.say_hello()

```

3.間違い探し

:がなかった

```lesson.py

class Greeting:
    def say_hello(self):
        print("hello paiza")

paiza = Greeting()
paiza.say_hello()

```

## 03:変数をクラスで管理しよう

class Plyaer:

```lesson.py

class Player:
    #コンストラクタ
    #クラスからオブジェクトを作成する時に
    #最初に呼ばれるメソッド
    #Plyaerclassにjobという変数を追加する
    def __init__(self,job):
    #インスタンス変数と呼ぶ
        self.job=job

    def walk(self):
        print(self.job+"は荒野を歩いていた")

player1=Player("戦士")
player1.walk()


player2=Player("魔法使い")
player2.walk()

#player1オブジェクトは戦士という値を持ち続けている
player1.walk()
```

```text:出力
戦士は荒野を歩いていた
魔法使いは荒野を歩いていた
戦士は荒野を歩いていた
```

```
#self.jobをインスタンス変数のこと

#オブジェクトが持つ変数のこと
#インスタンス変数はオブジェクトが存在する限り、
#値が保存される
        self.job=job

#selfとは
#インスタンス変数しようする際に必要な引数
#pythonではクラス内にあるメソッドの第一引数に
#メソッドの呼び出しに使ったオブジェクト自身が渡される
#selfは自分という意味の英語だが、
#メソッドの呼び出しに使ったオブジェクトのことを指している
#player1のworkメソッドを呼び出すとと、selfjobは
#player1のjob変数を呼び出す
#player2のworkメソッドをを呼び出すと
#player2のjob変数を呼び出している
 def __init__(self,job):

```

##演習

1.クラスからオブジェクトを作成しよう

```lesson.py
# クラスからオブジェクトを作成しよう

class Greeting:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        print("hello " + self.name)

# この下に、必要な処理を記述します

greeting=Greeting("paiza")
greeting.say_hello()

出力

hello paiza

```



2.クラスにインスタンス変数を追加しよう

```lesson.py

class Greeting:
    def __init__(self,name):

        self.name=name


    def say_hello(self):
        print("hello " + self.name)

paiza = Greeting("paiza")
paiza.say_hello()


hello paiza

```

3.間違い探し
class Plyaer:

```lesson.py

class Greeting:
    def __init__(self, name):
        self.name = name

    def say_hello(self):
        print("hello " + self.name)

paiza = Greeting("paiza")
paiza.say_hello()

```

## 04:RPGの敵クラスを作ろう
class Plyaer:

```lesson.py

おさらい
def attack(enemy):
    print(enemy + "は勇者を攻撃した")

attack("スライム")


'''
Enemyclassを作る
class Enemy:
    def__init__(self,name)
    self.name=name
'''
#Enemyclassを作る
'''
class Enemy:
    def__init__(self,name)
    self.name=name
'''
class Enemy:
    def __init__(self,name):
        self.name = name

    def attack(self):
    #enemy→self.nane
        print(self.name + "は勇者を攻撃した")

#enemyクラスからをオブジェクト作る
slime=Enemy("スライム")
slime.attack()

出力
スライムは勇者を攻撃した

```


```lesson.py

#Enemyclassを作る

class Enemy:
    def __init__(self,name):
        self.name = name

    def attack(self):
        print(self.name + "は勇者を攻撃した")

#複数の敵を作成するのに、リストにまとめる
enemies=[]
enemies.append(Enemy("スライム"))
enemies.append(Enemy("モンスター"))
enemies.append(Enemy("ドラゴン"))

#出力するためにfor文を使う
for enemy in enemies:
    enemy.attack()

出力
スライムは勇者を攻撃した
モンスターは勇者を攻撃した
ドラゴンは勇者を攻撃した

#英語のclassには分類という意味がある
#スライム、モンスター、ドラゴン、は同じEnemyクラスにいる敵だから共通のattackメソッドが使える

#英語インスタンスには実例という意味がある
#enemyクラスで敵という分類を定義してスライムやモンスターをオブジェクトとして作成している
#作成したリストをfor文でenemiesリストに代入している

```

##演習

RPGの攻撃シーン

```lesson.py

class Player:
    def __init__(self, name):
        self.name = name

    def attack(self, enemy):
        print(self.name + "は" + enemy + "を攻撃した")

team = []
team.append(Player("勇者"))
team.append(Player("戦士"))
team.append(Player("魔法使い"))

for player in team:
     player.attack("スライム")

```


##05:引数と戻り値のあるメソッドを作ろう

```lesson.py
class Item:
    def __init__(self,price,quantity):
        self.price=price
        self.quantity=quantity

    def total(self):
        return self.price * self.quantity
apple=Item(120,15)
print("合計金額は" + str(apple.total()) + "円です")
#total=apple.total(),str(total)
#としてもOK→totalメソッドの戻り値をprintで出力している
apple=Item(120,15)
print("合計金額は" + str(total) + "円です")
orange=Item(85,32)
print("合計金額は"+str(orange.total())+"円です")
出力
合計金額は1800円です
合計金額は1800円です
合計金額は2720円です
```


```lesson.py
税込金額にするには？
class Item:
    tax=1.08
#消費税を作りたい classs変数を使う、
#インスタンス変数と違いそのクラスから作成した
#オブジェクト全てで利用できる変数のこと

    def __init__(self,price,quantity):
        self.price=price
        self.quantity=quantity

    def total(self):
        #小数点以下を切り捨てるためのint
        #消費税を計算するための`Item.tax
        return int(self.price * self.quantity*Item.tax)
apple=Item(120,15)
total=apple.total()
print("合計金額は" + str(total) + "円です")
orange=Item(85,32)
print("合計金額は"+str(orange.total())+"円です")

合計金額は1944円です
合計金額は2937円です
 ```

##演習

 1.学生メソッドを呼び出す

 ```lesson.py

 class Gakusei:
    def __init__(self, kokugo, sansu):
        self.kokugo = kokugo
        self.sansu  = sansu
    def sum(self):
        return str(self.kokugo + self.sansu)
# この下に、必要な処理を記述します
yamada = Gakusei(70, 43)
print("合計は" +str(yamada.sum()) +"点です")
```

2.学生メソッドを作る

```lesson.py
class Gakusei:
    def __init__(self, kokugo, sansu):
        self.kokugo = kokugo
        self.sansu  = sansu
    # この下に、合計得点を戻り値として返すsumメソッドを記述する
    def sum(self):
        return str(self.kokugo + self.sansu)
yamada = Gakusei(70, 43)
print("合計は" + str(yamada.sum()) + "点です")
```

##06:文字列とリストのメソッド


1.文字列に対してメソッドを実行する

```lesson.py
text= "pYthon"
print(text)
#頭文字を大文字に
print(text.capitalize())
#全て大文字に
print(text.upper())
players="勇者,戦士,魔法使い,忍者"
#文字列をリストにする
#splitメソッドは、引数で指定した文字で
#文字列を分割してリストを返すメソッド
list=players.split(",")
print(list)
#リストで利用できるメソッド
#引数で指定した要素をリストから削除できる
list.remove("忍者")
print(list)
list.append("霧島")
print(list)
pYthon
Python
PYTHON
['勇者', '戦士', '魔法使い', '忍者']
['勇者', '戦士', '魔法使い']
['勇者', '戦士', '魔法使い', '霧島']
```

##演習

```lesson.py
入力
testcase
msg = input()
# この下に、msgが全て小文字かどうかを表示する処理を記述する
print(msg.islower())
出力
True
```

2.リストに対してメソッドを実行する

```lesson.py
team = ["勇者", "戦士", "魔法使い", "忍者"]
# この下に、インデックス3に「盗賊」を追加して、リストを表示する処理を記述する
team.insert(3, "盗賊")
print(team)
```

##07:アクセス制限を理解しよう


```lesson.py
class Player:
    def __init__(self, job, weapon):
        self.job = job
        self.weapon = weapon
    def walk(self):
        print(self.job + "は荒野を歩いていた")

    #メソッド名の前にアンダーバーをつける
    #__attack
    def __attack(self, enemy):
        print(self.weapon + "で" + enemy + "を攻撃")
    #__attack
        self.__attack("スライム")
player1 = Player("戦士", "剣")
player1.walk()
#__attack  クラスの外でしているこの処理はできない
#player1.__attack("スライム")
__.weapon
print(player1.weapon)
#変数名の前にアンダーバー(__)を２つを追加すると
#クラスの中でしか呼び出せない変数になる
#これをプライベート変数、プライベートプロパティという
```


```lesson.py
class Player:
    def __init__(self, job, weapon):
        self.job = job
        #__weapon
        self.__weapon = weapon
    def walk(self):
        print(self.job + "は荒野を歩いていた")

    def __attack(self, enemy):
        #__weapon
        print(self.__weapon + "で" + enemy + "を攻撃")
        self.__attack("スライム")
player1 = Player("戦士", "剣")
player1.walk()
#__weapon
print(player1.__weapon)
#変数名の前にアンダーバー(__)を２つを追加すると
#クラスの中でしか呼び出せない変数になる
#これをプライベート変数、プライベートプロパティという
```

##演習

「文字列に対してメソッドを実行する」

```lesson.py
class Greeting:
    def __init__(self, name):
        self.__name = name
    def say_hello(self):
    #ここにアンダーバー２つを追加する
        print("hello " + self.__name)
paiza = Greeting("paiza")
paiza.say_hello()
```