01 / 07
インスタンスを丸ごと print すると
ここまで print(kaiin.namae) のように、属性を1つずつ表示してきたね。では print(kaiin) と丸ごと渡すとどうなるだろう。
出てくるのは、こんな文字だよ。
<__main__.Kaiin object at 0x7f3a1c0d2e50>「Kaiin というクラスの実物が、メモリのこのあたりに置いてある」という意味。うそはついていないけれど、人に見せるための文字ではないね。
クラス
INPUT · スライド
01 / 07
ここまで print(kaiin.namae) のように、属性を1つずつ表示してきたね。では print(kaiin) と丸ごと渡すとどうなるだろう。
出てくるのは、こんな文字だよ。
<__main__.Kaiin object at 0x7f3a1c0d2e50>「Kaiin というクラスの実物が、メモリのこのあたりに置いてある」という意味。うそはついていないけれど、人に見せるための文字ではないね。
02 / 07
やっかいなのは、うしろの 0x7f3a... の部分が実行するたびに変わること。置かれた場所の番地だからだよ。
だからこの表示をあてにしたプログラムは書けないし、この教材の答え合わせにも使えない。前のレッスンまで「インスタンスをそのまま print してはいけない」と言ってきたのは、これが理由だよ。
03 / 07
クラスの中に __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
__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
__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__ … 文字にしたときの見え方次のグループでは継承を学ぶ。「ほとんど同じだけど、少しだけ違う」ものを作るときの書きかただよ。会員クラスをもとに、プレミアム会員クラスを作れるようになるんだ。