Pythonで__str__()および__repr__()メソッドの使用方法

紹介

この記事では、Pythonデータモデルで定義されている特別なメソッド__str__()__repr__()について学びます。 __str__()__repr__()メソッドは、オブジェクトに関する有用な情報をログに記録したり、プリントしたりして、Pythonコードのデバッグを支援するのに役立ちます。ログ記録

Pythonの特別なメソッドは、ダブルアンダースコアで始まり、終わることがあり、非公式にはダンダーメソッドとして知られています。 ダンダーメソッドは、Pythonの組み込み演算子や関数の基礎となるメソッドです。 ダンダーメソッドを直接呼び出すことは避け、代わりにクラスでダンダーメソッドを実装し、それを呼び出す組み込み関数(str()repr()など)を使用する必要があります。

__str__()__repr__()の違いは何ですか?

__str__()メソッドは、オブジェクトの人間が読みやすい、または非公式の文字列表現を返します。このメソッドは、組み込みのprint()str()、およびformat()関数によって呼び出されます。クラスの__str__()メソッドを定義しない場合、組み込みオブジェクトの実装は代わりに__repr__()メソッドを呼び出します。

__repr__()メソッドは、オブジェクトのより情報豊かな、または公式の文字列表現を返します。このメソッドは、組み込みのrepr()関数によって呼び出されます。可能な場合、返される文字列は、オブジェクトを再作成するために使用できる有効なPython式である必要があります。すべての場合において、文字列は情報提供があり曖昧さがないようにする必要があります。

一般的に、__str__()文字列はユーザー向けであり、__repr__()文字列は開発者向けです。

__str__()__repr__()の例、組み込みクラスを使用

このセクションの例では、デモンストレーション目的で__str__()および__repr__()メソッドを直接呼び出します。

datetime.datetimeクラスは、__str__()および__repr__()メソッドのデフォルトの実装を持つ組み込みのPythonクラスです。

以下の例コードは、datetime.datetimeオブジェクトの__str__()および__repr__()メソッドのデフォルト実装によって返される文字列を示しています:

import datetime

mydate = datetime.datetime.now()

print("__str__() string: ", mydate.__str__())
print("str() string: ", str(mydate))

print("__repr__() string: ", mydate.__repr__())
print("repr() string: ", repr(mydate))

出力は次のとおりです:

Output
__str__() string: 2023-01-27 09:50:37.429078 str() string: 2023-01-27 09:50:37.429078 __repr__() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078) repr() string: datetime.datetime(2023, 1, 27, 9, 50, 37, 429078)

出力からわかるように、str()関数は__str__()を呼び出して人間にとって親しみやすい文字列を返し、repr()関数は__repr__()を呼び出してオブジェクトを再作成するために使用できる情報豊富な文字列を返します。実際、eval()関数と組み合わせてrepr()関数を使用して新しいオブジェクトを文字列から作成できます:

import datetime

mydate1 = datetime.datetime.now()
mydate2 = eval(repr(mydate1))

print("mydate1 repr() string: ", repr(mydate1))
print("mydate2 repr() string: ", repr(mydate2))

print("the values of the objects are equal: ", mydate1==mydate2)

出力は次のとおりです:

Output
mydate1 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) mydate2 repr() string: datetime.datetime(2023, 1, 26, 9, 43, 24, 479635) the values of the objects are equal: True

前述の例コードは、mydate1repr()文字列からmydate2オブジェクトを作成し、両方のオブジェクトの値が等しいことを検証します。

__str__()および__repr__()メソッドを使用した例:新しいクラス

クラスを作成する場合は、組み込み関数が__repr__()を使用すると有用な情報が返されるように、少なくとも__repr__()メソッドを実装する必要があります。

次のクラスは__str__()または__repr()__メソッドを実装していません:

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

str()およびrepr()を使用した場合の出力は:

Output
<__main__.Ocean object at 0x102892860> <__main__.Ocean object at 0x102892860>

前の例は、オブジェクトのデフォルトの__repr()__の実装が、クラスとオブジェクトのidを16進数形式で含む文字列を返すことを示していますが、これはあまり役に立ちません。なお、str()repr()は同じ値を返します。なぜなら、__str__()が実装されていない場合、str()__repr__()を呼び出すからです。

__str__()__repr__()メソッドを実装したOceanクラスを更新します。

class Ocean:

    def __init__(self, sea_creature_name, sea_creature_age):
        self.name = sea_creature_name
        self.age = sea_creature_age
    
    def __str__(self):
        return f'The creature type is {self.name} and the age is {self.age}'

    def __repr__(self):
        return f'Ocean(\'{self.name}\', {self.age})'

c = Ocean('Jellyfish', 5)

print(str(c))
print(repr(c))

出力は次のとおりです:

Output
The creature type is Jellyfish and the age is 5 Ocean('Jellyfish', 5)

前の例の__str__()の実装は、ユーザーにとって関連するオブジェクトの詳細を提供する読みやすい文字列を返します。__repr__()の実装は、オブジェクトを再作成するために使用できる有効なPython式の文字列を返します:Ocean('Jellyfish', 5)。この例では、文字列のフォーマットにf文字列フォーマットを使用していますが、Pythonでサポートされている任意のフォーマットを使用して文字列をフォーマットすることができます。

まとめ

この記事では、__str__()メソッドと__repr__()メソッドの違いを探究し、これらの特殊メソッドをクラスに実装して直接呼び出す必要がないようにしました。Pythonの文字列を扱う方法について詳しくは、Python文字列チュートリアルをご覧ください。

Source:
https://www.digitalocean.com/community/tutorials/python-str-repr-functions