2012-09-30 68 views
6

Estoy trabajando con una clase que emula una lista de Python. Quiero devolverlo como una lista de Python() cuando accedo sin un índice.Emulando una lista en Python

con una lista normal():

 
>>> a = [1,2,3] 
>>> a 
[1,2,3] 

lo que estoy haciendo, esencialmente:

 
>>> a = MyList([1,2,3]) 
>>> a 
<MyList object at 0xdeadbeef> 

no puedo averiguar qué método dunder (si los hay) que me permitirá personalizar este comportamiento?

Creo que sería __ get __? a pesar de que list() no implementa get/set/delete - supongo porque es un built-in?

+0

he publicado una respuesta, pero en realidad no estoy seguro de lo que quiere decir. ¿Puedes dar un ejemplo de lo que quieres lograr? Si desea mostrar su lista cuando escribe 'a' en la consola, entonces está buscando el método' __repr__' –

+0

Lo que está viendo en el shell interactivo cuando ingresa solo el nombre es la cadena repr (REPResentational) . Lo mismo con el primero, donde una lista real emite una cadena que se parece al código fuente. Idealmente, 'eval (repr (object))' debería funcionar para tipos simples. Entonces, no estás "accediendo" cuando lo muestras así, sino que lo "codificas". – Keith

+0

sí, eso es exactamente lo que estaba buscando. Estaba confundido acerca de lo que realmente estaba sucediendo allí. – la11111

Respuesta

4

Debe anular el método __repr__ en su clase (y opcionalmente el método __str__ también), consulte este post para una discusión sobre las diferencias.

Algo como esto:

class MyList(object): 
    def __repr__(self): 
     # iterate over elements and add each one to resulting string 

Como se señaló en los comentarios, str() llama __repr__ si __str__ no está definido, pero no llama repr()__str__ si __repr__ no está definido.

+2

Si solo va a implementar una, implemente '__repr__' en lugar de' __str__'. 'str' llama a' __repr__' si '__str__' no está definido, pero' repr' no llama a '__str__' si' __repr__' no está definido. – senderle

+0

@senderle gracias por la aclaración, actualicé mi respuesta –

0

Permítame responder a mi propia pregunta: creo que es el método __repr__ el que estoy buscando. Por favor corrígeme si estoy equivocado. Esto es lo que ocurrió:

def __repr__(self): 
    return str([i for i in iter(self)]) 
+1

Supongo que solo 'return repr (self.lis)' es suficiente. –

3

Un ejemplo muy sencillo:

class MyList(object): 
    def __init__(self,arg): 
     self.mylist = arg 
    def __repr__(self): 
     return 'MyList(' + str(self.mylist) + ')' 
    def __str__(self): 
     return str(self.mylist) 
    def __getitem__(self,i): 
     return self.mylist[i] 

a = MyList([1,2,3]) 
print a 
print repr(a) 
for x in a: 
    print x 

Salida:

[1, 2, 3] 
MyList([1, 2, 3]) 
1 
2 
3