__str__ と __repr__ について

__str____repr__

オブジェクトが print()format() などで呼び出された場合の、文字列形式を定義するメソッドです。
__repr__は主にデバッグで使用するためのメソッドなので、__str__よりもより正式な内容を返却する必要があります。__str____repr__が両方存在している場合は、__str__が呼ばれます。

実際に挙動を確認してみます。


*どちらもなし

Personクラスを作成します。
print出力するとインスタンスが出力されます。
class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
  
tom = Person('Tom', 21)  
print(tom)

<実行結果>
<__main__.Person instance at 0x109e74320>


*__str__のみ

Personクラスに__str__を追加してprint出力すると、__str__で定義した文字列が出力されます。
class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
    def __str__(self):  
        return 'name:{}, age:{}'.format(self.name, self.age)  
  
  
tom = Person('Tom', 21)  
print(tom)

<実行結果>
name:Tom, age:21


__str____repr__

Personクラスに__str____repr__の両方を追加してprint出力をすると、__str__で定義した文字列が出力されます。
class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
    def __repr__(self):  
        return 'My name is {}, my old is {}'.format(self.name, self.age)  
  
    def __str__(self):  
        return 'name:{}, age:{}'.format(self.name, self.age)  
  
  
tom = Person('Tom', 21)  
print(tom)

<実行結果>
name:Tom, age:21


__repr__のみ

Personクラスに__repr__のみを定義してprint出力すると、__repr__で定義した文字列が出力されます。
class Person:  
    def __init__(self, name, age):  
        self.name = name  
        self.age = age  
  
    def __repr__(self):  
        return 'My name is {}, my old is {}'.format(self.name, self.age)  
  
  
tom = Person('Tom', 21)  
print(tom)

<実行結果>
My name is Tom, my old is 21


*所感

業務で__str__をよく見ることがあったのですが意味を理解していなかったので、今回調べて意味や使い方を学ぶことができてよかったです。
今後は、細かいことでもよく調べて理解していくようにしていきたいと思います。