Python __str__とは?print()での表示を自分で決める方法
__str__は、print()やstr()でオブジェクトをどう表示するかを決める特殊メソッドです。
定義しないと<__main__.P object at 0x105335be0>のような、人間には読めない表示になります。
__str__の基本
class Person:
def __init__(self, name, age):
self.name = name
self.age = age
def __str__(self):
return f"{self.name}({self.age}歳)"
p = Person("田中", 30)
print(p)
print(str(p))
print(f"{p}")
実行結果:
田中(30歳)
田中(30歳)
田中(30歳)
print()・str()・f文字列のすべてが同じ__str__を呼びます。1か所書けば全部に効きます。
定義しないとどうなるか
class NoStr:
pass
print(NoStr())
実行結果:
<__main__.NoStr object at 0x105335be0>
クラス名とメモリ上のアドレスが出るだけです。末尾の16進数は実行するたびに変わります。
ログやデバッグ出力でこれが並ぶと、中身がまったく分かりません。__str__を書く動機はここにあります。
戻り値は必ず文字列にする
class Bad:
def __str__(self):
return 123 # 数値を返してしまった
str(Bad())
実行結果:
TypeError: __str__ returned non-string (type int)
文字列以外を返すとエラーになります。数値を返したいときはstr()や f文字列で包んでください。
def __str__(self):
return str(123)
__repr__との関係
よく似た特殊メソッドに__repr__があります。役割は明確に分かれています。
| メソッド | 呼ばれる場面 | 想定読者 |
|---|---|---|
__str__ |
print()・str()・f文字列 |
エンドユーザー |
__repr__ |
repr()・対話シェル・リストの中身 |
開発者 |
片方だけ定義したときの動きが重要です。
class OnlyRepr:
def __repr__(self):
return "OnlyRepr()"
class OnlyStr:
def __str__(self):
return "OnlyStr!"
print(str(OnlyRepr()))
print(repr(OnlyStr()))
実行結果:
OnlyRepr()
<__main__.OnlyStr object at 0x105335be0>
__repr__だけ定義すればstr()も肩代わりしてくれますが、逆は効きません。
どちらか一方しか書かないなら、__repr__を書くほうが得です。詳しくは「Python __repr__とは?__str__との違いと使い分け」で解説しています。
リストに入れると__str__は呼ばれない
class Person:
def __init__(self, name):
self.name = name
def __str__(self):
return f"人物:{self.name}"
p = Person("田中")
print(p)
print([p])
実行結果:
人物:田中
[<__main__.Person object at 0x105335be0>]
リストや辞書の中身は__repr__で表示されます。__str__しか定義していないと、ここで元の表示に戻ってしまいます。
「単体では読めるのにリストに入れると読めない」という混乱は、ほぼこれが原因です。
実用的な書き方
class Money:
def __init__(self, yen):
self.yen = yen
def __str__(self):
return f"{self.yen:,}円"
def __repr__(self):
return f"Money(yen={self.yen})"
m = Money(1234567)
print(m)
print([m])
実行結果:
1,234,567円
[Money(yen=1234567)]
両方定義するのが基本形です。
__str__は読みやすさ優先(記号や単位を付ける)__repr__は再現性優先(そのままコードとして書ける形)
書式指定まで自分で決めたい場合は__format__を使います。「Python __format__とは?f文字列の書式指定を自作する方法」を参照してください。
__str__のまとめ
print()・str()・f文字列から呼ばれる- 未定義だと
<__main__.クラス名 object at 0x…> - 戻り値は必ず文字列——でないと
TypeError - リストの中身は
__repr__が使われる __repr__だけでもstr()は動く(逆は不可)- 実務では両方定義しておくのが無難






