Python : __str__() と __repr__() は、オブジェクトを文字列で表現する

TwitterFacebookHatena
  • 公開:2021-8-26
  • 更新:2023-10-26
  • 文章量:1842
  • Python

TL;DR

__str__()__repr__()は、どちらもオブジェクトの文字列表現を返す特殊メソッドである。

__str__()__repr__()のポイント

  • __str__()は、オブジェクトを文字列で表現する特殊メソッド
  • __str__()は、print()に渡された場合に呼ばれる
  • str()はユーザーが分かりやすい形で表示される
  • repr()は引数にシングルクォーテーションマークを付けて返す

__repr__()は、組み込み関数の repr()が呼び出される。print()に渡された場合は、__str__()が呼ばれる。

その前に str()と repr() の違いについて説明しておく。

str()と repr() の違い

str()は、object の 文字列、つまりユーザーが分かりやすい形で表示され、repr()はオブジェクトの印字可能な表現を含む文字列を返す。

str('hoge')

# 'hoge'

分かりやすくいうと、repr()は、引数にシングルクォーテーションマークを付けて返す。

repr('hoge')

# ''hoge''

__str__()__repr__() の違い

__str__()について公式を翻訳した。

str(object)や,組み込み関数 format(),print()によって呼び出され,オブジェクトの "非公式 "またはきれいに印刷できる文字列表現を計算します.戻り値は、文字列オブジェクトでなければなりません。

このメソッドは object.__repr__() とは異なり、 __str__() が有効な Python 式を返すことは期待されていません: より便利で簡潔な表現が使用できます。

組み込み型の object で定義されたデフォルトの実装では、 object.__repr__() を呼び出します。

__str__()は、オブジェクトを文字列で表現する特殊メソッドである。str(object)や、組み込み関数の print()に渡された場合に呼ばれる。

次に、__repr__() について公式を翻訳した。

オブジェクトの文字列表現を計算するために repr() 組み込み関数によって呼び出されます。これは同じ値のオブジェクトを再生成するのに使用できる有効な Python の式のように見えるべきです。それができない場合は、<...some useful description...>という形式の文字列が返されます。

戻り値は、文字列オブジェクトでなければなりません。もし、あるクラスが__repr__()を定義していて、__str__()を定義していない場合、そのクラスのインスタンスの "非公式 "な文字列表現が必要な場合には、__repr__()も使用されます。

参考:3. Data model — Python 3.3.7 documentation

オブジェクト名のみを入力するとobject.__repr__()が呼ばれるので、以下のような結果となる。__repr__()は、組み込み関数の repr()が呼び出される。

a = 'hoge'
a

# 'hoge'

しかし、組み込み関数である print() を経由すると__str__()が呼ばれるので、上の結果と異なる。

a = 'hoge'
print(a)

# hoge

オブジェクトだとobject.__repr__()が呼ばれる。

class A:
    def __init__(self, x):
        self.x = x
    def __str__(self):
        return 'str'
    def __repr__(self):
        return 'repr'

a = A(1)
a

# repr

print() を経由すると__str__()が呼ばれる。

class A:
    def __init__(self, x):
        self.x = x
    def __str__(self):
        return 'str'
    def __repr__(self):
        return 'repr'

a = A(1)
print(a)

# str

Python : __str__() と __repr__() は、オブジェクトを文字列で表現する