Pythonの__repr__の目的


139
def __repr__(self):
  return '<%s %s (%s:%s) %s>' % (
    self.__class__.__name__, self.urlconf_name, self.app_name,
    self.namespace, self.regex.pattern)

この方法の重要性/目的は何ですか?


@ zjm1126:>>> variable__repr__()が返されるのかを知りたいですか?
EstebanKüber2009

18
そのドキュメントは人々を眠らせます。さらに、これがどのように使用されるかを他の人から学ぶことは役に立ちます。
Concerned_Citizen 2015


2
Pythonを学習しているJava開発者にとって、これを確認する最善の方法は、JavaのtoString()を使用することです。
Ravi

回答:


187

__repr__オブジェクトの印刷可能な表現を返す必要があります。おそらく、このオブジェクトを作成する方法の1つです。こちらの公式ドキュメントをご覧ください__repr____str__エンドユーザー向けであり、開発者向けです。

簡単な例:

>>> class Point:
...   def __init__(self, x, y):
...     self.x, self.y = x, y
...   def __repr__(self):
...     return 'Point(x=%s, y=%s)' % (self.x, self.y)
>>> p = Point(1, 2)
>>> p
Point(x=1, y=2)

2
lazy1:私は主にフォーマットを修正したかった(例をサンプルセッションで表示されるものと可能な限り一致させると便利です)が、出力形式を微調整して割り当てとは明確に異なるようにしましたこれについて混乱している誰かの明快さを大幅に改善します。(私が遠くまで行ってしまった場合は、再編集してください。そうすればビールをお借りします。)


1
%sの代わりに%rを使用する必要があります:stackoverflow.com/questions/6005159/…–
Jonathan Adelson

43
これは実際には正しくありません。__str__人間が読めるようになっているはずの出力です__repr__。Pythonインタープリターが読める表現になるはずです(つまり、インタープリターに文字列を渡すと、オブジェクトが再作成されます)。__str__ただし、オブジェクトにメソッドがない場合は、__repr__代わりに使用されます。述べたように、またこの例では、実際に印刷__str__する方法self.xself.y%rの代わりに使用されるべき%s動作をフォーマットストリングに(クラスが定義されていないので__str____repr__実際にとにかく戻され、それは異常です)。
Daniel Andersson 2013年

20

これはPythonのドキュメントで非常によく説明されています

reprobject):オブジェクトの印刷可能な表現を含む文字列を返します。これは、変換(逆引用符)によって得られる値と同じです。この操作に通常の関数としてアクセスできると便利な場合があります。多くのタイプの場合、この関数は、に渡されたときに同じ値を持つオブジェクトを生成する文字列を返そうとしますeval()。それ以外の場合、表現は、オブジェクトのタイプの名前と追加情報を含む山括弧で囲まれた文字列です。多くの場合、オブジェクトの名前とアドレスが含まれます。クラスは、__repr__()メソッドを定義することにより、この関数がインスタンスに対して返すものを制御できます。

したがって、ここに表示されているのはのデフォルトの実装であり__repr__、シリアル化とデバッグに役立ちます。


5
オブジェクトの「表現」を取得する逆引用符(または「バックティック」)メソッドは推奨されて
おらず

MatrixFrog:どちらもtrueですが、現在の2.xのドキュメントにはまだこれが記載されており、ここから引用が行われます。

多くのオブジェクトでは、__ repr__と__str__は同じ関数です。実際、__ str__だけを定義すると、__ repr__はデフォルトで__str__を呼び出すだけになります。これが当てはまらない最も明白なケースは文字列自体です。str( 'stackoverflow')は戻りますstackoverflowが、repr( 'stackoverflow')は'stackoverflow'です。
MatrixFrog 2009

6
逆に言えば、__ repr__が__str__を使用することは決してありませんが、逆の場合があります。docs.python.org/reference/…を

13

__repr__スタンドアロンのPythonインタプリタがクラスを印刷可能な形式で表示するために使用されます。例:

~> python3.5
Python 3.5.1 (v3.5.1:37a07cee5969, Dec  5 2015, 21:12:44) 
[GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> class StackOverflowDemo:
...     def __init__(self):
...         pass
...     def __repr__(self):
...         return '<StackOverflow demo object __repr__>'
... 
>>> demo = StackOverflowDemo()
>>> demo
<StackOverflow demo object __repr__>

__str__メソッドがクラスで定義されていない場合は__repr__、印刷可能な表現を作成しようとして関数を呼び出します。

>>> str(demo)
'<StackOverflow demo object __repr__>'

さらに、print()クラスを呼び出すと__str__、デフォルトでが呼び出されます。


必要に応じて、ドキュメント



1

それらの違いを確認する例(私はこのソースからコピーしました)、

>>> x=4
>>> repr(x)
'4'
>>> str(x)
'4'
>>> y='stringy'
>>> repr(y)
"'stringy'"
>>> str(y)
'stringy'

との戻り値はrepr()str()同じですがint x、の戻り値には違いがあります。str y一方は正式なもので、もう一方は非公式です。公式表現と非公式表現の最も重要な違いの1つは、__repr__str値ののデフォルトの実装をevalへの引数として呼び出すことができ、戻り値が次のように有効な文字列オブジェクトになることです。

>>> repr(y)
"'a string'"
>>> y2=eval(repr(y))
>>> y==y2
True

の戻り値__str__をevalの引数として呼び出そうとすると、結果は無効になります。


1

クラスを定義して新しい型を作成する場合、Pythonの特定の機能を利用して、新しいクラスを使いやすくすることができます。これらの機能の1つは「特殊メソッド」であり、「マジックメソッド」とも呼ばれます。

特別なメソッドには、2つのアンダースコアで始まり、2つのアンダースコアで終わる名前があります。それらを定義しますが、通常、名前で直接呼び出すことはありません。代わりに、特定の状況下で自動的に実行されます。

printステートメントを使用してオブジェクトのインスタンスの値を出力できると便利です。これを行うときは、値をわかりやすい形式で出力に表示する必要があります。reprの特別な方法は、この現象が発生するように構成するために使用することができます。このメソッドを定義すると、このメソッドを定義したクラスのインスタンスの値を出力するときに、自動的に呼び出されます。ただし、同様の目的で使用されるstr特殊メソッドもあり、同じように定義されている場合、優先される可能性があります。

定義していない場合は、Point3Dクラスのreprメソッドで、my_pointをPoint3Dのインスタンスとしてインスタンス化してから、これを実行します...

出力my_point ...これは出力として表示される場合があります...

あまり良くないですね

したがって、より良い出力を得るために、reprまたはstr特殊メソッド、あるいはその両方を定義します。

**class Point3D(object):
    def __init__(self,a,b,c):
        self.x = a
        self.y = b
        self.z = c
    def __repr__(self):
        return "Point3D(%d, %d, %d)" % (self.x, self.y, self.z)
    def __str__(self):
        return "(%d, %d, %d)" % (self.x, self.y, self.z)
my_point = Point3D(1, 2, 3)
print my_point # __repr__ gets called automatically
print my_point # __str__ gets called automatically**

出力...

(1、2、3)(1、2、3)


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.