Python
 Computer >> コンピューター >  >> プログラミング >> Python

Pythonの__str__と__repr__の違いを徹底解説!正しい使い分けのポイント

Pythonの__str__と__repr__、その違いとは?

Pythonには、オブジェクトを文字列として表現するための組み込み関数として repr()str() の2つが用意されています。これらはそれぞれ、内部で object.__repr__(self)object.__str__(self) という特殊メソッド(ダンダーメソッド)を呼び出します。

repr() はオブジェクトの公式な(official)表現を計算して返すのに対し、str()非公式な(informal)表現を返します。この違いを具体的に見ていきましょう。

整数オブジェクトの場合:両者の結果は同じ

まず、整数オブジェクトに対しては、repr()str() の戻り値は同じになります。

>>> x = 1 
>>> repr(x)
'1'
>>> str(x)
'1'

文字列オブジェクトの場合:結果が異なる

しかし、文字列オブジェクトになると話が変わります。repr() は文字列を引用符付きで返すため、見た目が異なります。

>>> x = "Hello"
>>> repr(x)
"'Hello'"
>>> str(x)
'Hello'

さらに重要な点として、文字列オブジェクトに対する repr() の戻り値は、eval() 関数で評価すると有効な文字列オブジェクトとして復元できます。一方、str() の結果は評価できません。

>>> y1 = repr(x)
>>> eval(y1)
'Hello'
>>> y2 = str(x)
>>> eval(y2)
NameError: name 'Hello' is not defined

これは、repr() が「そのオブジェクトを再現できる形式」で文字列を返すためです。上記の例では、str() の結果である Hello は変数名として扱われ、未定義のため NameError が発生します。

まとめ:repr()とstr()の使い分け

まとめると、以下のように整理できます。

  • repr():オブジェクトの明確で曖昧さのない(unambiguous)デフォルト表現を返す。多くの場合、eval() で元のオブジェクトを再現可能。
  • str():人間にとって読みやすい非公式な表現を返す。ただし、必ずしも曖昧さがないとは限らない。

実務では、デバッグやログ出力には repr() を、エンドユーザー向けの画面表示には str() を使うのが一般的なベストプラクティスとされています。自作クラスでこれらをカスタマイズしたい場合は、__repr__ メソッドと __str__ メソッドを適切に定義しましょう。

  1. 【Python】Tkinterのroot.destroy()とroot.quit()の違いを徹底解説

    PythonのGUIライブラリ「Tkinter」では、アプリケーションを終了する方法として destroy() と quit() の2つのメソッドがよく使われます。似たような役割に見えますが、実際には動作が異なります。この記事では、それぞれの違いをサンプルコード付きでわかりやすく解説します。 root.destroy()とは tkinterのウィンドウオブジェクトに対して destroy() メソッドを呼び出すと、mainloop の処理が終了し、ウィンドウ内のすべてのウィジェットが破棄されます。つまり、ウィンドウそのものが完全に閉じられ、バックグラウンドで動作しているインタプリタ(Tcl/T

  2. Pythonのtkinterとtkinter.ttkウィジェットの違いとは?スタイリング方法を解説

    tkinter.ttkは、tkinterウィジェットのスタイル(見た目)を設定するためのモジュールです。HTML要素にCSSでデザインを適用するように、tkinter.ttkを使うことでtkinterウィジェットの外観を自由にカスタマイズできます。 tkinterウィジェットとtkinter.ttkの主な違い tkinterウィジェットは、ボタン・ラベル・テキスト・スクロールバーなど、基本的なGUI部品を追加するために使用します。一方、tkinter.ttkは標準のtkinterよりも多くの種類のウィジェットをサポートしています。 tkinter.ttkではPlaceやPack()、Grid