概要

Pythonにはオブジェクトの文字列表現を制御するための2つの特殊メソッド、__str____repr__があります。これらはどちらもオブジェクトを文字列として表現しますが、その目的と使用場面が異なります。本記事では、これら2つのメソッドの違いや役割、使い分けについて詳しく解説します。

__repr__の目的

__repr__はオブジェクトの「公式な」文字列表現を返すメソッドです。この表現は開発者向けに設計されており、可能であればその表現をeval()関数に渡すことで、元のオブジェクトを再生成できることが理想です。__repr__の主な用途は、デバッグやログでの使用です。開発者がオブジェクトの内部状態を確認しやすいように、詳細な情報を含む表現が推奨されます。 例えば、datetimeオブジェクトの場合、__repr__は次のような表現を返します:

datetime.datetime(2024, 10, 22, 14, 30, 45)

この表現は、eval()で再現できる形です。

__str__の目的

一方、__str__はオブジェクトの「人間にとって読みやすい」文字列表現を返します。__str__の主な目的はエンドユーザー向けの簡潔で直感的な出力です。例えば、上記のdatetimeオブジェクトの__str__は、以下のようにより単純な形式を返します:

2024-10-22 14:30:45

このように、__str__はオブジェクトを簡潔に、わかりやすく表示するためのメソッドであり、print()関数やstr()関数が呼び出されたときに使用されます。

__repr____str__の違いと使い分け

簡単にまとめると、__repr__は開発者がオブジェクトの詳細な状態を確認するために使用するのに対し、__str__はエンドユーザーがオブジェクトを読みやすく理解するために使われます。これらのメソッドを適切に実装することで、開発効率を上げ、ユーザー体験を向上させることができます。 次に、これら2つのメソッドの違いを示す具体例を見てみましょう。

使用例

__repr____str__の基本的な実装

以下の例では、__repr____str__の両方を持つクラスを定義しています。

class MyClass:
    def __init__(self, value):
        self.value = value
    def __repr__(self):
        return f"MyClass(value={self.value!r})"
    def __str__(self):
        return f"MyClass with value {self.value}"
# オブジェクトの生成
obj = MyClass(10)
# __repr__の出力
print(repr(obj))  # MyClass(value=10)
# __str__の出力
print(str(obj))   # MyClass with value 10

このように、__repr__は開発者がオブジェクトの内部状態を確認するための詳細な表現を提供し、__str__はユーザーに対してシンプルで読みやすい表現を返します。

__repr__の詳細な使い方

__repr__では、オブジェクトの詳細な内部状態を含めた表現が求められます。例えば、オブジェクトが複雑なデータ構造を持つ場合でも、すべての要素が明確に表示されるべきです。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __repr__(self):
        return f"Point(x={self.x!r}, y={self.y!r})"
p = Point(1, 2)
print(repr(p))  # Point(x=1, y=2)

__str__の使い方

一方、__str__では、ユーザーが理解しやすいように必要な情報だけを表示することが重要です。

class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y
    def __str__(self):
        return f"Point at ({self.x}, {self.y})"
p = Point(1, 2)
print(str(p))  # Point at (1, 2)

結論

__repr____str__はそれぞれ異なる目的を持つメソッドであり、適切に使い分けることで、オブジェクトの表現方法を柔軟に制御できます。__repr__はデバッグやログで使用されるための詳細な表現を提供し、__str__はエンドユーザーに対して読みやすい情報を提供します。どちらもクラスを設計する際に考慮すべき重要なメソッドです。