コンテンツにスキップ

__repr__の使い方と修正法

[

Pythonにおける.repr()と.str()の使い分け

この記事では、Pythonの特殊メソッドである.repr()と.str()について説明します。これらのメソッドを使用することで、オブジェクトの文字列表現を制御し、プログラムの可読性やデバッグのしやすさを向上させることができます。では、いつ.repr()を使用すべきで、いつ.str()を使用すべきでしょうか?

一つのプログラムが行う最も一般的なタスクの一つは、データの表示です。この情報は通常、プログラムのユーザーに表示されます。ただし、プログラムは開発およびメンテナンスを行うプログラマに情報を表示する必要もあります。プログラマがオブジェクトについて必要とする情報は、プログラムのユーザーに対して同じオブジェクトを表示する際に異なるため、そこで .__repr__().__str__()が必要となります。

Pythonのオブジェクトには、特定の振る舞いを提供するいくつかの特殊メソッドがあります。.__repr__().__str__()という2つの似たような特殊メソッドは、文字列表現を使ってオブジェクトを説明します。.__repr__()メソッドは、コードのメンテナンスとデバッグを行うプログラマに対して詳細な説明を返します。.__str__()メソッドは、プログラムのユーザーに向けてより簡単な説明を返します。

.__repr__().__str__()メソッドは、任意のクラスで定義できる特殊メソッドの一部です。これらのメソッドを定義することで、print()関数やフォーマット済み文字列、対話型環境など、さまざまな形式の出力でプログラムがオブジェクトを表示する方法を制御することができます。

このチュートリアルでは、.__repr__().__str__()の違いを詳しく解説し、これらの特殊メソッドを自分が定義したクラスで使用する方法を学びます。これらのメソッドを効果的に定義することで、自分が書いたクラスの可読性が向上し、デバッグやメンテナンスが容易になります。では、Pythonの.__repr__().__str__()のどちらを選ぶべきなのでしょうか。

In Short: プログラマー向けには.__repr__()を、ユーザー向けには.__str__()を使用する

.__repr__()および.__str__()という特殊メソッドは、オブジェクトの文字列表現を返します。文字列表現とは、オブジェクトについての情報を示す文字列のことです。この情報をプログラムのユーザーやプログラマーなど、異なる対象に合わせて調整することができます。

他の特殊メソッドと同様に、先頭と末尾に2つのアンダースコアがあるため、どのクラスでもこれらのメソッドを定義することができます。

オブジェクトを表示するために2つのメソッドが存在する理由は、それらに異なる目的があるためです。

  • .__repr__()は、プログラマー向けの公式の文字列表現を提供します。
  • .__str__()は、ユーザー向けの非公式の文字列表現を提供します。

.__repr__()が返す文字列表現のターゲットは、プログラムを開発およびメンテナンスするプログラマーです。一般的に、これはオブジェクトについて詳細で曖昧さのない情報を提供します。公式の文字列表現のもう一つの重要な特性は、プログラマーが通常、それを使用して元のオブジェクトと同じものを再作成することができるということです。

.__str__()メソッドはプログラムのユーザーを対象とした文字列表現を提供しますが、それがPythonのプログラマーでない場合もあります。したがって、この表現は任意のユーザーが理解できるように設計されています。

.repr()と.str()のアクセス方法は?

オブジェクトの文字列表現を取得する方法はいくつかありますが、2つの主な方法があります。

  1. print()関数を使用する
  2. str()repr()関数を直接使用する

それぞれの方法について見ていきましょう。

1. print()関数を使用する

print()関数を使用してオブジェクトを表示する場合、Pythonはまず.__str__()メソッドを探し、その結果を表示します。もし.__str__()メソッドが定義されていない場合、Pythonは代わりに.__repr__()メソッドを使用します。

以下に例を示します。

class MyClass:
def __repr__(self):
return "This is the official representation"
def __str__(self):
return "This is the informal representation"
obj = MyClass()
print(obj)

このコードでは、MyClassというクラスを定義し、.__repr__()メソッドと.__str__()メソッドを実装しています。print(obj)とすると、Pythonはまず.__str__()メソッドを実行し、その結果を表示します。結果は次のとおりです。

This is the informal representation

2. str()repr()関数を直接使用する

str()repr()関数を使用してオブジェクトの文字列表現を取得することもできます。これらの関数は、指定したオブジェクトの.__str__()メソッドと.__repr__()メソッドを直接呼び出して結果を返します。

以下に例を示します。

class MyClass:
def __repr__(self):
return "This is the official representation"
def __str__(self):
return "This is the informal representation"
obj = MyClass()
print(str(obj))
print(repr(obj))

このコードでは、同様にMyClassクラスを定義し、.__repr__()メソッドと.__str__()メソッドを実装しています。str(obj)とすると、Pythonはobj.__str__()メソッドを実行し、その結果を返します。repr(obj)とすると、Pythonはobj.__repr__()メソッドを実行し、その結果を返します。結果は次のとおりです。

This is the informal representation
This is the official representation

カスタムクラスで. repr()と.str()を定義すべきですか?

一般的には、カスタムクラスを定義する際には、必要に応じて.__repr__()メソッドと.__str__()メソッドを定義することをお勧めします。これらのメソッドを定義すると、作成したクラスのオブジェクトの表示がより直感的で読みやすくなります。

.__repr__()メソッドは、プログラマーがそのオブジェクトについて得られる詳細な情報を提供します。これにより、デバッグや開発の際に非常に役立ちます。

一方、.__str__()メソッドは、オブジェクトをプログラムのユーザーに表示するための情報を提供します。これにより、ユーザーがプログラムの出力を理解しやすくなります。

以下に例を示します。

class Person:
def __init__(self, name):
self.name = name
def __repr__(self):
return f"Person('{self.name}')"
def __str__(self):
return f"This person's name is {self.name}"
person = Person("Alice")
print(person) # This person's name is Alice
print(repr(person)) # Person('Alice')

このコードでは、Personというクラスを定義し、.__repr__()メソッドと.__str__()メソッドを実装しています。personオブジェクトを表示すると、Pythonはperson.__str__()メソッドを実行し、結果を表示します。repr(person)を呼び出すと、Pythonはperson.__repr__()メソッドを実行し、結果を表示します。結果は次のとおりです。

This person's name is Alice
Person('Alice')

まとめ

Pythonの.__repr__().__str__()メソッドは、プログラムのオブジェクトを異なる目的(プログラマー向けとユーザー向け)で表示するために使用されます。.__repr__()メソッドは、プログラマーに対してオブジェクトの詳細な情報を提供し、デバッグや開発に役立ちます。一方、.__str__()メソッドは、プログラムのユーザーに表示するための情報を提供します。

カスタムクラスを定義する際には、必要に応じて.__repr__()メソッドと.__str__()メソッドを定義することをお勧めします。これにより、プログラムの可読性が向上し、デバッグやメンテナンスが容易になります。