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__
を理解することで、オブジェクトの見せ方をコントロールでき、よりプロフェッショナルなコードが書けるようになります。