2009-05-17 14 views
19

私は__str__(self)を実装するPythonでクラスを作成しましたが、このクラスのインスタンスを含むリストでprintを使うと、デフォルトの出力<__main__.DSequence instance at 0x4b8c10>が得られます。これを動作させるために実装する必要がある別の魔法の機能はありますか、カスタム印刷機能を記述する必要はありますか?ここでリスト、辞書、またはオブジェクトのコレクションをPythonで印刷する方法

クラスです:

class DSequence: 

    def __init__(self, sid, seq): 
     """Sequence object for a dummy dna string""" 
     self.sid = sid 
     self.seq = seq 

    def __iter__(self): 
     return self 

    def __str__(self): 
     return '[' + str(self.sid) + '] -> [' + str(self.seq) + ']' 

    def next(self): 
     if self.index == 0: 
      raise StopIteration 
     self.index = self.index - 1 
     return self.seq[self.index] 

答えて

22

はい、あなたは__repr__を使用する必要があります。その動作の簡単な例は:

>>> class Foo: 
...  def __repr__(self): 
...    return '__repr__' 
... 
>>> bar = Foo() 
>>> bar 
__repr__ 
>>> print bar 
__repr__ 

すべてのものが考えられとして、:あなたは__str__を定義しない場合、これはお勧めしませんが、

>>> class Foo: 
...  def __str__(self): 
...    return '__str__' 
...  def __repr__(self): 
...    return '__repr__' 
... 
>>> bar = Foo() 
>>> bar 
__repr__ 
>>> print bar 
__str__ 
>>> repr(bar) 
'__repr__' 
>>> str(bar) 
'__str__' 

しかし、それは、バック__repr__に落ちますマニュアルでは、デバッグには__repr__が使用されていることを推奨しており、オブジェクトの控え目なものであるreprを返す必要があります。連結のための+を避け

+0

はマニュアルが可能であれば、これを再作成するために使用することができ、有効なPython式のようになるはずです」と言うものに準拠した、それは価値があります(適切な環境が与えられている)同じ値を持つオブジェクトだからDSequence(1、 'GTTAC')のようなもの? –

+0

いい考えです。 –

+0

また、私はこれについてqを見つけました。http://stackoverflow.com/questions/452300/python-object-reprself-should-be-an-expression ありがとうございました。 –

1

ほんの少しの強化:

def __str__(self): 
    return '[%s] -> [%s]' % (self.sid, self.seq) 
+0

あなたが思うとはしません。それをフォーマットする必要があります。 – SilentGhost

関連する問題