コンテンツにスキップ

Python __repr__メソッドの使い方

[

Pythonの.repr()と.str()の使い方

Mar 22, 2023 Stephen Gruppetta 0コメント

コンピュータープログラムが行う最も一般的なタスクの1つは、データの表示です。プログラムはこの情報をユーザーに表示することがありますが、同じオブジェクトを開発およびメンテナンスするプログラマーに対しても情報を表示する必要があります。そのため、.repr()と.str()の登場です。

Pythonのオブジェクトには、特定の動作を提供するいくつかの特別なメソッドがあります。オブジェクトを文字列表現で説明する2つの似た特殊メソッドがあります。それらは.repr()と.str()です。.repr()メソッドは、コードのメンテナンスとデバッグを行う必要があるプログラマーに対して詳細な説明を返します。.str()メソッドはプログラムのユーザーに向けた簡易な説明を返します。

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

このチュートリアルでは、.repr()と.str()の違いと、自分で定義するクラスでこれらの特殊メソッドを使用する方法を学びます。これらのメソッドを効果的に定義することで、作成したクラスをより読みやすく、デバッグおよびメンテナンスが容易になります。では、いつPythonの.repr()を選び、いつ.str()を選ぶべきでしょうか。

短く言えば、.repr()はプログラマー向け、.str()はユーザー向け

特殊メソッドは、オブジェクトの文字列表現を返します。文字列表現とは、オブジェクトに関する情報を表示する文字列です。この情報は、プログラムのユーザーや他のプログラマーなど、異なる対象に対してカスタマイズすることができます。

.repr()と.str()の2つのメソッドがオブジェクトを表示する方法が存在する理由は、それぞれ異なる目的があるためです。

  • .repr()メソッドは、プログラムを開発およびメンテナンスするプログラマーを対象とした、オブジェクトの公式の文字列表現を提供します。
  • .str()メソッドは、プログラムのユーザーを対象とした非公式の文字列表現を提供します。

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

.str()メソッドは、プログラムのユーザー向けの文字列表現を提供します。そのため、この表現はPythonプログラマーでない場合でも、任意のユーザーが理解できるようになっています。

これらの特殊メソッドを使用することで、オブジェクトのビジュアルな表現を制御できます。例えば、print()関数でオブジェクトを表示するときに自動的に呼び出される他のメソッドと組み合わせることができます。特定のオプションやフラグを持つプログラムを作成している場合に便利です。

オブジェクトの文字列表現へのアクセス方法は?

オブジェクトの文字列表現にアクセスするには、以下のような方法があります。

  1. repr()関数を使用して.repr()メソッドを呼び出します。
  2. str()関数を使用して.str()メソッドを呼び出します。
  3. 文字列の結合やフォーマットなど、直接メソッドを呼び出す方法で文字列と組み合わせます。

たとえば、次のようにして.repr()と.str()を呼び出すことができます。

>>> class MyClass:
... def __init__(self, x, y):
... self.x = x
... self.y = y
... def __repr__(self):
... return f'MyClass(x={self.x}, y={self.y})'
... def __str__(self):
... return f'x={self.x}, y={self.y}'
...
>>> obj = MyClass(2, 3)
>>> repr(obj)
'MyClass(x=2, y=3)'
>>> str(obj)
'x=2, y=3'
>>> f'This object: {obj}'
'This object: x=2, y=3'

この例では、MyClassというクラスを定義し、それぞれの特殊メソッドでオブジェクトの文字列表現を定義しています。repr(obj)では.repr()メソッドが呼び出され、str(obj)では.str()メソッドが呼び出されます。また、文字列の結合やフォーマットの一部として特殊メソッドを直接呼び出すこともできます。

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

オブジェクトの.repr()と.str()メソッドを定義するかどうかは、そのクラスの目的と状況によります。一般的には、次の場合にメソッドを定義することをお勧めします。

  • オブジェクトがデバッグやメンテナンスで使用される場合
  • オブジェクトで異なる文字列表現を提供する必要がある場合
  • オブジェクトが可読性やデバッガビリティを向上させる場合

カスタムクラスを作成するときには、通常は少なくとも.repr()メソッドを定義します。これにより、オブジェクトの公式の文字列表現が提供され、プログラマーがオブジェクトの状態を確認するのに役立ちます。.str()メソッドは、オブジェクトの非公式の文字列表現を提供する場合に便利です。

たとえば、ゲームのキャラクターを表すクラスを作成してみましょう。このクラスには、.repr()メソッドと.str()メソッドを定義します。

class Character:
def __init__(self, name, level):
self.name = name
self.level = level
def __repr__(self):
return f'Character(name={self.name}, level={self.level})'
def __str__(self):
return f'{self.name} (Level {self.level})'
player = Character('Player', 10)
print(repr(player))
print(str(player))

これにより、オブジェクトの公式の文字列表現と非公式の文字列表現が提供されます。このような表現を定義することで、ゲームキャラクターを開発・メンテナンスするプログラマーや、プレイヤー自身がゲーム内で確認できます。

結論

Pythonの.repr()と.str()メソッドは、オブジェクトの文字列表現を制御するための特殊メソッドです。.repr()は、プログラマーが開発・メンテナンスする際にオブジェクトの情報を提供するためのものであり、.str()はプログラムのユーザーに対して理解しやすい形式で情報を提供するためのものです。

カスタムクラスを作成する際には、必要に応じてこれらの特殊メソッドを定義することをお勧めします。これにより、プログラマーがオブジェクトの状態を確認しやすくなり、プログラムのユーザーがオブジェクトを理解しやすくなります。

次回のチュートリアルでは、他の特殊メソッドについて詳しく説明します。それまでの間、Pythonのオブジェクトをより効果的に使用するための.repr()と.str()メソッドを実装してみてください。

関連記事: