Skip to content

Pythonの__str__と__repr__の違い

Updated on

Pythonプログラミングの世界では、__str____repr__はダンダーメソッド(Double Underscore)またはマジックメソッド、スペシャルメソッドとしても知られています。これらはPythonにおけるオブジェクト指向プログラミングのバックボーンとして機能しています。この包括的なガイドは、これら2つのメソッドの独特な機能、Pythonにおけるその重要性、および適切なアプリケーションのインスタンスを明らかにしようとしています。さらに、このガイドでは、根本的なコンセプトを確立するために、多数のコード例を示します。

Python Pandas Dataframeからコードを記述せずにデータ可視化を簡単に作成したい場合、

PyGWalker は、データ探索と可視化のためのPythonライブラリです。PyGWalker (opens in a new tab) は、pandasドキュメントフレームワーク(およびpolarsフレームワーク)をTableauスタイルのユーザーインターフェイスに変換して、視覚的な探索のためのワークフローを簡素化できます。

PyGWalker for Data visualization (opens in a new tab)

用語の定義:__str__ vs __repr__

深く掘り下げる前に、これら2つの重要なメソッドを定義してみましょう。

__str__ メソッド

Pythonにおいて、__str__は、オブジェクトの「非公式」または表示可能な文字列表現を計算するためのメソッドです。人間が読める出力を提供することを目的としています。したがって、このメソッドを実装する際には、可読性が重要な考慮事項です。

以下は、簡単な例です。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def __str__(self):
        return f'{self.name}{self.age}歳です。'
 
john = Person('John Doe', 30)
print(str(john))  # 出力:John Doeは30歳です。

__repr__ メソッド

一方、__repr__は、オブジェクトの「公式」の文字列表現を計算するためのメソッドです。その目的は、eval()関数にフィードされた場合にオブジェクトを再作成するために使用できる詳細な表現を提供することです。オブジェクトの完全な説明を提供するために特にデバッグやログ記録で役立ちます。

同じ Person クラスを考えてみましょうが、__repr__ メソッドを持っている場合です。

class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
 
    def __repr__(self):
        return f'Person(name={self.name}, age={self.age})'
john = Person('John Doe', 30)
print(repr(john))  # Outputs: Person(name=John Doe, age=30)
 
## `__str__`と`__repr__`の違いと使い分け
 
これらのメソッドの基本的な理解ができたので、それぞれの使用場面について探っていきましょう。
 
### `__str__`:ユーザフレンドリーな文字列表現
 
`__str__`メソッドは主にエンドユーザー向けです。オブジェクトの非公式で読みやすい説明を提供します。プログラマではないユーザーにとって理解しやすい方法でオブジェクトを表示する方法と考えることができます。
 
Pythonクラスでこのメソッドを実装する場合は、サードパーティが使用している場合を除き、最大限に表示する情報がエンドユーザーにとって最も適していることにフォーカスしてください。
 
```python
class Product:
    def __init__(self, name, price):
        self.name = name
        self.price = price
 
    def __str__(self):
        return f'{self.name}は${self.price}で販売されています。'
 
iPhone = Product('iPhone', 999)
print(str(iPhone))  # Outputs: iPhoneは$999で販売されています。

上記の例では、__str__メソッドはProductオブジェクトの簡単で人間が読める説明を提供しています。 str(iPhone)からの出力は、ウェブサイトやアプリでユーザーに直接表示できます。

__repr__:デバッグと開発

一方、__repr__メソッドは主に開発者向けです。オブジェクトの完全で曖昧でない表現を提供します。これは、デバッグやロギングに非常に役立ちます。

__repr__メソッドを実装する際のゴールデンルールは、可能であればeval()関数を使用してオブジェクトを再作成できる文字列を返すことです。これは、特に複雑なオブジェクトの場合、常に実現可能ではありませんが、良いガイドラインとなります。

__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})'
 
iPhone = Product('iPhone', 999)
print(repr(iPhone))  # Outputs: Product(name=iPhone, price=999)

__repr__メソッドの出力は、__str__メソッドと比較してはるかに詳細で技術的です。この詳細レベルは、効果的なデバッグやロギングに必要なものです。

あなたのPythonクラスに合わせた__str____repr__の使い方

両方のメソッドをクラスに定義することは一般的ですが、実装方法は特定の使用例に大きく依存するため、多くの場合、特定の使用例に応じたクラス定義が必要になります。 __str__メソッドを定義する際には、オブジェクトとやり取りする人々と彼らが必要とする情報を考えることが重要です。このメソッドは、オブジェクトの簡潔で読みやすい要約を返す文字列を返すべきです。

例えば、映画チケット予約アプリケーションにMovieクラスがあるとします。

class Movie:
    def __init__(self, title, director, rating):
        self.title = title
        self.director = director
        self.rating = rating
 
    def __str__(self):
        return f'{self.title} by {self.director}, rated {self.rating}/10.'
 
inception = Movie('Inception', 'Christopher Nolan', 8.8)
print(str(inception))  # 出力: Inception by Christopher Nolan, rated 8.8/10.

詳細なオブジェクトの説明のための__repr__の作成

__repr__メソッドを実装する際には、コードをデバッグしたり、オブジェクトの状態を記録したりする人々にとって役立つ情報を考慮する必要があります。その文字列には、一目でオブジェクトを理解するために必要なすべての情報を含めるべきです。

Movieクラスを引き続き例に挙げると、__repr__メソッドは次のようになります。

class Movie:
    def __init__(self, title, director, rating):
        self.title = title
        self.director = director
        self.rating = rating
 
    def __repr__(self):
        return f'Movie(title={self.title}, director={self.director}, rating={self.rating})'
 
inception = Movie('Inception', 'Christopher Nolan', 8.8)
print(repr(inception))  # 出力: Movie(title=Inception, director=Christopher Nolan, rating=8.8)

FAQ: Pythonの__str____repr__の理解

Pythonの__str____repr__メソッドの基本的な概念について学びました。しかし、これらのダンダーメソッドに関する質問がまだあるかもしれません。よくある質問について説明しましょう。

  1. __str____repr__をPythonクラスに定義しない場合、どうなりますか?

    __str__または__repr__をクラスで定義しない場合、Pythonはデフォルトの実装を使用します。デフォルトの__str__メソッドは、クラス名とそのメモリ内のアドレスを含む文字列を返します。デフォルトの__repr__も同様です。

  2. 常にクラスで__str____repr__メソッドの両方を実装するべきですか?

    __repr__を少なくとも実装することが望ましく、__str__が定義されていない場合のフォールバックとして使用されるためです。ただし、両方を実装するかどうかは、あなたの特定のニーズに依存します。クラスオブジェクトにユーザーフレンドリーな文字列表現が必要であれば、__str__を実装する価値があります。

  3. __str____repr__はどのタイプの文字列を返せますか?

    __str____repr__は理論的にはどのタイプの文字列でも返せますが、慣習に従うのが最善です。__str__は読みやすく簡潔であるべきで、__repr__は詳細であり、可能であればeval()を使用してオブジェクトを再現できるようにする必要があります。

Python クラスの strrepr を定義しなかった場合、何が起こるのですか?

もし str または repr をクラスで定義しなかった場合、デフォルトの実装が使われます。デフォルトの str メソッドは、クラス名とメモリ上のアドレスが含まれた文字列を返します。一方、デフォルトの repr は同じことをします。

クラスごとに strrepr を実装すべきですか?

少なくとも repr を実装する習慣をつけることは良いでしょう。それは str が定義されていない場合の代替手段として使われるためです。ただし、両方を実装するかどうかは、特定のニーズによって異なります。クラスオブジェクトがユーザーフレンドリーな文字列表現を持つ必要がある場合は、str を実装する価値があります。

strrepr は任意の種類の文字列を返せますか?

strrepr は技術的には任意の種類の文字列を返すことができますが、従うべき慣習があります。str は読みやすく簡潔であるべきで、repr は詳細で、可能であれば eval() を使ってオブジェクトを再現できるようにすると良いでしょう。