Pythonの特殊メソッド__str__と__repr__の違い
説明
__str__と__repr__はPythonでオブジェクトの文字列表現を定義する二つの特殊メソッドだ。この二つのメソッドは似た役割を持っているが、その目的と使用される状況は異なる。まず、__str__という名前はstringから取られ、文字通りオブジェクトまたはオブジェクトの値そのものを文字列として返す。一方、__repr__という名前はrepresentationから取られたもので、オブジェクトを表現する文字列を返す。つまり、__repr__はオブジェクトを再現できる文字列を返し、__str__はユーザーに必要な見せるための文字列を返すということだ。最終的には定義する人がどう定義するかによって異なるが、何らかのオブジェクトobjについて、eval(obj.__repr__())でobjを再現できるようにするのが推奨される。
また、REPLでobjを入力したときに出てくる文字列が__repr__の結果であり、print(obj)をしたときに出てくる文字列が__str__の結果と言える。では、以下のように日付と時間に関する情報を持つdtというオブジェクトを定義してみよう。
import datetime
dt = datetime.datetime(2025, 5, 28, 16, 53, 45)
dt.__str__()はこのオブジェクトが持っている情報である2025年5月28日16時53分45秒という情報をユーザーに見やすい形で表示する。
>>> dt.__str__()
'2025-05-28 16:53:45'
>>> str(dt)
'2025-05-28 16:53:45'
>>> print(dt)
2025-05-28 16:53:45
一方、dt.__repr__()はこのオブジェクトを再現できる文字列を見せる。つまり、eval(dt.__repr__())をすればdtと同じオブジェクトが作られる。
>>> dt.__repr__()
'datetime.datetime(2025, 5, 28, 16, 53, 45)'
>>> repr(dt)
'datetime.datetime(2025, 5, 28, 16, 53, 45)'
>>> dt
datetime.datetime(2025, 5, 28, 16, 53, 45)
>>> eval(repr(dt)) == dt
True
ただし、すべてのPythonクラスでこれが守られるわけではないことに注意しよう。例えば、numpy.arrayやtorch.tensorなどの場合でも__repr__メソッドがそのオブジェクトを再現できるような文字列を返すわけではない。
環境
- OS: Windows11
- Version: Python 3.10.11
