logo

Pythonの特殊メソッド__str__と__repr__の違い 📂プログラミング

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.arraytorch.tensorなどの場合でも__repr__メソッドがそのオブジェクトを再現できるような文字列を返すわけではない。

環境

  • OS: Windows11
  • Version: Python 3.10.11