クラス

INPUT · スライド

そのまま print できるようにする

01 / 07

インスタンスを丸ごと print すると

ここまで print(kaiin.namae) のように、属性を1つずつ表示してきたね。では print(kaiin) と丸ごと渡すとどうなるだろう。

出てくるのは、こんな文字だよ。

<__main__.Kaiin object at 0x7f3a1c0d2e50>

「Kaiin というクラスの実物が、メモリのこのあたりに置いてある」という意味。うそはついていないけれど、人に見せるための文字ではないね。

02 / 07

しかも実行のたびに変わる

やっかいなのは、うしろの 0x7f3a... の部分が実行するたびに変わること。置かれた場所の番地だからだよ。

だからこの表示をあてにしたプログラムは書けないし、この教材の答え合わせにも使えない。前のレッスンまで「インスタンスをそのまま print してはいけない」と言ってきたのは、これが理由だよ。

03 / 07

__str__ を定義する

クラスの中に __str__ というメソッドを書いておくと、print したときにそちらが使われるようになる。

アンダースコア2本で囲まれているとおり、これも Python が決まったときに呼ぶ名前。自分で kaiin.__str__() と呼ぶ必要はないよ。

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

実行結果

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

04 / 07

必ず文字列を return する

__str__ の中では、return で文字列を返す。うっかり print してしまうと、返すものが無くなってエラーになるよ。

「表示する」のではなく「表示される文字を作って渡す」のが __str__ の仕事だと覚えよう。

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

実行結果

あおい
TypeError: __str__ returned non-string (type NoneType)

05 / 07

数を返そうとしてもだめ

返すのは必ず文字列。年数だけを見せたいときも、数のまま返すとさっきと同じ TypeError になるよ。

str() で文字に変えるか、f文字列に埋めこもう。

class Kaiin:    def __init__(self, nensuu):        self.nensuu = nensuu    def __str__(self):        return str(self.nensuu) + "年目"kaiin = Kaiin(3)print(kaiin)

実行結果

3年目

06 / 07

f文字列の中でも使われる

__str__ が呼ばれるのは print のときだけじゃない。str() に渡したときも、f文字列の {} の中に書いたときも使われるよ。

「このインスタンスを文字にするなら?」と Python が聞いてくる場所なら、どこでも同じ答えが返るんだ。

class Kaiin:    def __init__(self, namae):        self.namae = namae    def __str__(self):        return f"{self.namae}さん"kaiin = Kaiin("あおい")print(f"ようこそ、{kaiin}")

実行結果

ようこそ、あおいさん

07 / 07

ここまでのまとめ

これで、データを持ち、できることを持ち、人に読める顔を持つクラスが書けるようになったよ。

  • class … 設計図を作る
  • __init__ … 生まれる瞬間に中身を決める
  • self … いま扱っている、その実物自身
  • メソッド … その実物にできること
  • __str__ … 文字にしたときの見え方

次のグループでは継承を学ぶ。「ほとんど同じだけど、少しだけ違う」ものを作るときの書きかただよ。会員クラスをもとに、プレミアム会員クラスを作れるようになるんだ。