__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__ は出力形式を指定しつつ、値を再定義して出力することができます。
使い分けることができるために、お互いの違いを明確にしておくことが重要です。