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