2013-08-23 6 views
7

私はこのコードを書く:私は__str__と__repr__の違いは?

print((Item("Car"),)) 

を実行すると、私はこれにコードを変更すると

class Item: 
    def __init__(self, name): 
     self._name = name; 
    def __str__(self): 
     return "Item: %s" % self._name 

出力は

(<__main__.Item object at 0x0000000002D32400>,) 

です:

class Item: 
    def __init__(self, name): 
     self._name = name; 
    def __repr__(self): 
     return "Item: %s" % self._name 
    def __str__(self): 
     return "Item: %s" % self._name 

それはそのn個の出力

(Item: Car,) 

は、だから今は __repr____str__の違いについて混乱しています。

答えて

16

__str____repr__は、どちらもオブジェクトの文字列表現を取得する方法です。 __str__は、より短く、よりユーザフレンドリーであると考えられており、__repr__は、より詳細な情報を提供することになっています。

__repr__は、多くのデータ型に対して、Pythonに貼り付けた場合、その値が元の値と等しい有効な式になる文字列を返します。たとえば、str('Hello')'Hello'を返しますが、repr('Hello')"'Hello'"を返します。文字列の中には引用符が含まれています。その文字列を出力した場合、'Hello'が得られ、それをPythonに貼り付けた場合、元の文字列が返されます。

ファイルオブジェクトのようなデータ型の中には、このように文字列に変換できないものがあります。このようなオブジェクトのメソッド__repr__は通常、オブジェクトのデータ型とメモリアドレスを含む山括弧で囲まれた文字列を返します。ユーザーが定義したクラスは、__repr__メソッドを特に定義していない場合にもこれを行います。

REPLで値を計算すると、Pythonは__repr__を呼び出して文字列に変換します。ただし、printを使用すると、Pythonは__str__を呼び出します。

print((Item("Car"),))を呼び出すときはメソッドと同じtupleクラスの__str__メソッドを呼び出しています。このメソッドは、タプル内の各項目の__repr__メソッドを呼び出し、カンマ(1アイテムタプルの場合は後ろの1つ)と一緒に結合し、全体をカッコで囲みます。なぜ__str__メソッドがtupleであるのかわからないのですが、その内容に__str__が呼び出されますが、そうではありません。

+0

私にそれを打つ! :) http://docs.python.org/2/reference/datamodel.html#object.__repr__ –

+0

あなたは私にもそれを打つ!しかし、 '__repr__'は通常、オブジェクトを再現する文であると予想されるというメモを追加すると便利です。ドキュメントから: "これは、同じ値を持つオブジェクトを再作成するために使用できる有効なPython式のように見えるはずです"。 –

+0

...そして、私は本当に質問の実際の点を見逃していたことに気付きました。一定。 – Taymon

関連する問題