Python入門 `__str__`と`__repr__`ってなんですか?

__str____repr__ってなんですか?

_ はアンダースコアです。
アンダースコアが2つ並ぶと「ダブルアンダースコア」となります。
これを「ダンダースコア」ということが多いです。
__str__は、「ストリングダンダースコア」、__repr__は、「リプレ(representation)ダンダースコア」と言います。

classを使うときに使います。
簡単な classを用意します。

簡単なクラスで名前を年齢を表示

class Person:
	def __init__(self, name: str, age: int) -> None:
	self.name = name
	self.age = age

	mike = Person('Mike', 20)
print(mike)
#  <__main__.Person object at 0x10d56ad60>

出力はオブジェクトのアドレスが出力されます。
これだと意味がないので、もう少し手を加えます。

#!/usr/local/env python3

class Person:
	def __init__(self, name: str, age: int) -> None:
		self.name = name
		self.age = age

mike = Person('Mike', 20)
# print(mike)
print(f'name: {mike.name}, age: {mike.age}')
# name: Mike, age: 20

ちゃんと出力されました。
これで終わっても良いのですが、もっと便利な方法もあります。
だって、出力するたびに、

print(f'name: {mike.name}, age: {mike.age}')

こんなこと書いていたら面倒ですから。

__str__で工夫する

classに__str__関数を追記します。
classをprint()するときに呼び出されます。

#!/usr/local/env python3

class Person:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    # これです
    def __str__(self) -> str:
        return f'name: {self.name}, age: {self.age}'

mike = Person('Mike', 20)
# print(mike)
# print(f'name: {mike.name}, age: {mike.age}')
# name: Mike, age: 20

print(mike)
# name: Mike, age: 20

classをprint()するとオブジェクトのアドレスが出力されましたが、__str__を追記しておくと、クラスをprint()したときに、お好みの形式で出力(returnで返す)することが可能です。

__repr__でさらに工夫する

#!/usr/local/env python3

class Person:
    def __init__(self, name: str, age: int) -> None:
        self.name = name
        self.age = age

    def __str__(self) -> str:
        return f'name: {self.name}, age: {self.age}'

    # これです
    def __repr__(self) -> str:
        return f"Person(name='{self.name}', age={self.age})"

mike = Person('Mike', 20)
# print(mike)
# print(f'name: {mike.name}, age: {mike.age}')
# name: Mike, age: 20

# __str__ 
#print(mike)
# name: Mike, age: 20

# __repr__
mike = Person('Mike', 30) # 年齢が10老けました
print(repr(mike))             # 再定義
# Person(name='Mike', age=30) 
print(mike)                   # 確認
# name: Mike, age: 30         

__repr__ は、prepresentation(再定義)することを指します。
ようするに、定義したクラスのメンバーを再定義することができます。
__str__ は出力形式を指定して値を返す事ができます。
__repr__ は出力形式を指定しつつ、値を再定義して出力することができます。

使い分けることができるために、お互いの違いを明確にしておくことが重要です。

書籍の紹介

Python入門 リストを簡単に出力したいのですが?

Python入門 リストを簡単に出力したいのですが?

Python入門 回文かどうかを調べたいのですが?

Python入門 回文かどうかを調べたいのですが?