クラス

INPUT · スライド

生まれる瞬間に中身を決める

01 / 07

作るたびに同じ手作業をしている

前のレッスンでは、Kaiin() で作ったあとに属性を1つずつ手で足していた。書き忘れれば形がそろわないし、人数が増えるほど行も増える。

「作るときに必ずやること」が決まっているなら、それは設計図のほうに書いておきたいよね。

02 / 07

__init__ を書く

クラスの中に def __init__(self): と書くと、実物が生まれる瞬間に一度だけこの中が動くよ。

呼び出す行はどこにも書かない。Kaiin() と書いた瞬間に、Python が勝手に走らせてくれるのがポイントだよ。

class Kaiin:    def __init__(self):        print("かいいんができた")kaiin = Kaiin()print("おわり")

実行結果

かいいんができた
おわり

03 / 07

アンダースコア2本のしるし

__init__ の前とうしろにあるのは、アンダースコアが2本ずつ。_init_ ではないので気をつけてね。

アンダースコア2本で囲まれた名前は、Python が特別あつかいするしるしだよ。「自分で呼ぶ名前ではなく、決まったときに Python が呼んでくれる名前」という目印だと思っておこう。

04 / 07

self に値を持たせる

__init__ の最初の引数 self(セルフ)は、いままさに作られている、その実物自身を指すよ。

だから self.namae = "あおい" と書けば、その実物に属性を持たせられる。できあがった時点でもう中身がそろっているんだ。

class Kaiin:    def __init__(self):        self.namae = "あおい"        self.nensuu = 3kaiin = Kaiin()print(kaiin.namae)print(kaiin.nensuu)

実行結果

あおい
3

05 / 07

作るときに値を渡す

これだと何人作っても同じ中身になってしまう。個体ごとに違う値にするには、__init__ に引数を足そう。

渡すのは Kaiin("あおい", 3) のように、クラス名のうしろの () の中。第3章でやった引数とまったく同じ仕組みだよ。self は自分では渡さない。

class Kaiin:    def __init__(self, namae, nensuu):        self.namae = namae        self.nensuu = nensuua = Kaiin("あおい", 3)b = Kaiin("ひなた", 1)print(a.namae)print(b.namae)

実行結果

あおい
ひなた

06 / 07

左と右で同じ名前でもいい

self.namae = namae は左右で名前が同じで、ちょっと不思議に見えるよね。でも意味はきっぱり分かれているよ。

  • 左の self.namae … これから作る実物が持つ属性
  • 右の namae … いま受け取った引数

「受け取った値を、その実物の持ちものに写す」と読めばいいよ。

07 / 07

外から読める・書ける

self. をつけて入れた属性は、外から kaiin.namae でふつうに読めるし、あとから書きかえることもできる。

引数の初期値もそのまま使えるよ。書かなかったときの値を決めておけるので、「たいていは1年目」のような既定を設計図に持たせられるんだ。

次のレッスンでは、この箱に「できること」を入れていこう。

class Kaiin:    def __init__(self, namae, nensuu=1):        self.namae = namae        self.nensuu = nensuukaiin = Kaiin("みなと")print(kaiin.nensuu)kaiin.nensuu += 1print(kaiin.nensuu)

実行結果

1
2