2009-05-17 22 views
19

Escribí una clase en python que implementa __str__(self) pero cuando uso print en una lista que contiene instancias de esta clase, obtengo la salida predeterminada <__main__.DSequence instance at 0x4b8c10>. ¿Hay alguna otra función mágica que deba implementar para que funcione, o debo escribir una función de impresión personalizada?Cómo imprimir una lista, dict o colección de objetos, en Python

Aquí está la clase:

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] 

Respuesta

22

Sí, es necesario utilizar __repr__. Un ejemplo rápido de su comportamiento:

>>> 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__' 

Sin embargo, si no se define un __str__, cae de nuevo a __repr__, aunque esto no se recomienda:

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

A fin de cuentas, como el manual recomienda, __repr__ se utiliza para la depuración y debe devolver algo repr indicativo del objeto.

+0

¿Vale la pena conforme a lo que el manual dice "Si es posible, esto debe verse como una expresión válida en Python que podría ser utilizado para recrear una objeto con el mismo valor (dado un entorno apropiado) ". ¿Algo así como DSequence (1, 'GTTAC')? –

+0

Es una buena idea, sí. –

+0

Ok, también encontré esto q para ese http://stackoverflow.com/questions/452300/python-object-reprself-should-be-an-expression Gracias por su ayuda. –

1

Sólo una pequeña mejora evitando el + para concatenar:

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

no hace lo que crees que hace. necesitas formatearlo. – SilentGhost

Cuestiones relacionadas