クラス

INPUT · スライド

設計図に「できること」を書く

01 / 07

データのとなりに処理を置く

このグループの最初のレッスンで困ったのは、会員のデータと、それを使う関数がバラバラの場所にあることだった。

クラスの中には関数も書ける。クラスの中に書いた関数のことをメソッドと呼ぶよ。これでデータと処理が同じ箱に入るんだ。

02 / 07

メソッドの書きかた

__init__ と同じように、クラスの中に字下げして def を書く。最初の引数は必ず selfだよ。

呼ぶときは kaiin.aisatsu() のように、インスタンスにドットをつけて呼ぶ。self は自分では書かない。Python が「誰が呼んだか」を自動で入れてくれるからね。

class Kaiin:    def __init__(self, namae):        self.namae = namae    def aisatsu(self):        print(f"こんにちは、{self.namae}さん")kaiin = Kaiin("あおい")kaiin.aisatsu()

実行結果

こんにちは、あおいさん

03 / 07

self は「その実物自身」

同じ設計図から作った会員が100人いても、self.namae と書けばいま呼ばれた、その人の名前になるよ。

最初は呪文に見えるけれど、self は「誰の話をしているか」を書いているだけなんだ。a.aisatsu() なら self は a、b.aisatsu() なら self は b だよ。

class Kaiin:    def __init__(self, namae):        self.namae = namae    def aisatsu(self):        print(f"こんにちは、{self.namae}さん")a = Kaiin("あおい")b = Kaiin("ひなた")a.aisatsu()b.aisatsu()

実行結果

こんにちは、あおいさん
こんにちは、ひなたさん

04 / 07

self を書き忘れると

def aisatsu(): と self を書かずに定義して、kaiin.aisatsu() と呼ぶとエラーになるよ。

呼んだ側は何も渡していないのに「1個渡された」と言われる。これが呼ばれた実物が自動で渡っているなによりの証拠だね。

class Kaiin:    def aisatsu():        print("こんにちは")kaiin = Kaiin()kaiin.aisatsu()

実行結果

TypeError: Kaiin.aisatsu() takes 0 positional arguments but 1 was given

05 / 07

メソッドも値を返せる

print するだけでなく、return で値を返すメソッドも書ける。第3章でやった関数とまったく同じだよ。

表示は呼んだ側にまかせるほうが、あとで使い回しやすいんだったね。

class Kaiin:    def __init__(self, nensuu):        self.nensuu = nensuu    def nenkaihi(self):        if self.nensuu >= 3:            return 4000        return 5000kaiin = Kaiin(3)print(kaiin.nenkaihi())

実行結果

4000

06 / 07

メソッドは引数も取れる

self のうしろに、ふつうの引数を並べられるよ。呼ぶときは self のぶんを飛ばして、2つ目から渡すんだ。

メソッドの中で self.pointo を書きかえれば、その実物の状態が変わる。「ポイントをためる」のような処理が素直に書けるね。

class Kaiin:    def __init__(self, pointo):        self.pointo = pointo    def tameru(self, kazu):        self.pointo += kazukaiin = Kaiin(10)kaiin.tameru(5)print(kaiin.pointo)

実行結果

15

07 / 07

データと処理が1つになった

最初のレッスンで散らばっていた「表示する」「年会費を計算する」が、いまは Kaiin の中にそろっている。

項目の名前を変えたくなったら、見る場所はこのクラスの中だけ。これがクラスのいちばんのごほうびだよ。

次のレッスンでは、print(kaiin) と丸ごと渡したときの見え方を決めよう。

class Kaiin:    def __init__(self, namae, nensuu):        self.namae = namae        self.nensuu = nensuu    def hyouji(self):        return f"{self.namae}さん(会員{self.nensuu}年目)"    def nenkaihi(self):        if self.nensuu >= 3:            return 4000        return 5000kaiin = Kaiin("あおい", 3)print(kaiin.hyouji())print(kaiin.nenkaihi())

実行結果

あおいさん(会員3年目)
4000