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