Pythonオブジェクトの文字列表示を変更する方法


問題
オブジェクトのインスタンスの印刷または表示出力を変更したいです。それらがより読み取り可能になります。
ソリューション
一例の文字列表現を変更するには、その__u u u_を再定義することができます。str()同前repr_()方法。たとえば:

class Pair:
  def __init__(self, x, y):
    self.x = x
    self.y = y

  def __repr__(self):
    return 'Pair({0.x!r}, {0.y!r})'.format(self)

  def __str__(self):
    return '({0.x!s}, {0.y!s})'.format(self)
__repr__()方法は、典型的にはこの例を再構成するために使用される例のコード表現形式を返す。内蔵された repr() 関数はこの文字列を返します。私たちがインタラクティブ・インタラクティブ・インタプリタを使って表示した値と同じです。__str__() 方法は、一例を文字列に変換し、str() またはprint() 関数を使用してこの文字列を出力する。たとえば:

>>> p = Pair(3, 4)
>>> p
Pair(3, 4) # __repr__() output
>>> print(p)
(3, 4) # __str__() output
>>>
ここではまた、フォーマット時にどのように異なる文字列表現を使うかを実証しています。特に、!rフォーマットコード指定出力は、デフォルトの__repr__() の代わりに__str__() を使用する。前のクラスを使ってテストしてみてもいいです。

>>> p = Pair(3, 4)
>>> print('p is {0!r}'.format(p))
p is Pair(3, 4)
>>> print('p is {0}'.format(p))
p is (3, 4)
>>>
討論する
カスタム__repr__() および__str__() は、デバッグおよびインスタンス出力を簡単にすることができるので、通常は良い習慣である。例えば、出力またはログのみを印刷して出力する場合、プログラマは、インスタンスがより詳細で有用な情報を見ることができる。
同前repr_()生成されたテキスト文字列の標準的な作り方は、eval(repr(x)==xを本物にする必要があります。どうしてもこのようにできないなら、有用なテキスト表示を作成して、<と>を使ってくくります。たとえば:

>>> f = open('file.dat')
>>> f
<_io.TextIOWrapper name='file.dat' mode='r' encoding='UTF-8'>
>>>
__str__() が定義されていない場合、出力の代わりに __repr__() が使用される。
上のformat() 方法の使用は面白そうです。フォーマットコード{0.x} は第1のパラメータのx属性に対応しています。したがって、以下の関数では、0は実際にself自体を指す。

def __repr__(self):
  return 'Pair({0.x!r}, {0.y!r})'.format(self)
このような実装の代替として、%オペレータを使用することもできます。

def __repr__(self):
  return 'Pair(%r, %r)' % (self.x, self.y)
以上はPythonがオブジェクトの文字列表示を変更する方法の詳細です。Pythonがオブジェクトを変更する文字列表示に関する資料は他の関連記事に注目してください。