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()は動く(逆は不可)
  • 実務では両方定義しておくのが無難

あわせて読みたい

プログラミング学習に興味がある方は、まずは無料体験会へ

無料体験会・お申し込みはこちら