Python|__str__と__repr__の違いと活用法

1. はじめに

Pythonでオブジェクトの中身を確認したり、デバッグ中に変数の内容を出力したとき、__str____repr__というメソッドが関係していることをご存知でしょうか?
この記事では、「Python|__str__と__repr__の違いと活用法」というテーマで、両者の役割や違い、使い分けのポイントを初心者にもわかりやすく解説します。

実務においては、ログ出力やデバッグ時にオブジェクトの中身を読みやすく表示したい場面がよくあります。そんなとき、__str____repr__を正しく使いこなすことが、コードの可読性や保守性に大きく影響します。

 

2. __str__と__repr__の基本解説と違い

__str__とは?

__str__は、str()関数やprint()関数で呼び出されるときに使用される特殊メソッドで、「人が読みやすい」形式で文字列を返すために使います。

class Person:
    def __init__(self, name):
        self.name = name

    def __str__(self):
        return f"Personの名前は {self.name} です"

p = Person("Taro")
print(p)

実行結果:

Personの名前は Taro です

__repr__とは?

__repr__は、repr()関数や、インタプリタでオブジェクトを直接参照したときに使われる特殊メソッドで、「開発者が理解しやすい情報(=正式な文字列表現)」を返すことが目的です。

class Person:
    def __init__(self, name):
        self.name = name

    def __repr__(self):
        return f"Person(name='{self.name}')"

p = Person("Hanako")
print(repr(p))

実行結果:

Person(name='Hanako')

__str__と__repr__の違いを比較

ポイントを表でまとめると、以下のようになります。

項目 __str__ __repr__
主な目的 ユーザー向けの見やすい文字列 開発者向けの正確な表現
呼び出し print(obj), str(obj) repr(obj), 変数単体参照
フォールバック __str__が未定義なら__repr__が使われる フォールバックなし

 

3. よくある使い方・応用例

__repr__をデバッグ用に活用する

オブジェクトの内部状態をわかりやすく出力できるようにすることで、バグ発見がスムーズになります。

class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price

    def __repr__(self):
        return f"Product(name='{self.name}', price={self.price})"

item = Product("ノートPC", 98000)
print(item)  # __repr__が使われる

実行結果:

Product(name='ノートPC', price=98000)

__str__をログ出力などで活用する

ユーザーにわかりやすくログを残したい場合は__str__を活用します。

class LogEntry:
    def __init__(self, message, level):
        self.message = message
        self.level = level

    def __str__(self):
        return f"[{self.level}] {self.message}"

entry = LogEntry("データの保存に成功", "INFO")
print(entry)

実行結果:

[INFO] データの保存に成功

 

4. 注意点・エラー対策

__str__または__repr__が未定義だとどうなる?

どちらも定義しなかった場合、デフォルトでは<クラス名 object at メモリアドレス>のような出力になります。これは開発には不向きです。

class Sample:
    pass

s = Sample()
print(s)  # __str__も__repr__もないとこうなる

実行結果:

<__main__.Sample object at 0x7fcf5a1c1d60>

__repr__は“再現可能な文字列”を返すのが理想

__repr__は基本的に「その文字列をeval()で再評価したら同じオブジェクトが作れる」ことを目指すのが理想です。ただし、必須ではありません。

__str__に戻り値がない・型が違うとエラーに

__str____repr__文字列を返す必要があります。それ以外を返すとエラーになります。

class ErrorExample:
    def __str__(self):
        return 123  # 数値を返すとTypeError

# print(ErrorExample())  # TypeErrorになる

 

5. まとめ

  • __str__は「人が読む」ための出力
  • __repr__は「開発者が読む」ための出力
  • デバッグやログ、データ確認など、目的に応じて使い分けるのが重要

実務では、開発中のクラスに__repr__をまず実装し、必要に応じて__str__で整形するというパターンが多く見られます。どちらも「可視化による理解・確認」を助ける強力な武器です。ぜひ自作クラスで実践してみてください。

このように、Pythonの__str____repr__を理解することで、オブジェクトの見せ方をコントロールでき、よりプロフェッショナルなコードが書けるようになります。

タイトルとURLをコピーしました