2012-09-30 13 views
6

Sto lavorando con una classe che emula un elenco python. Voglio restituirlo come un python list() quando accedo senza un indice.Emulazione di un elenco in Python

con una lista normale():

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

cosa voglio dire, in sostanza:

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

io non riesco a capire quale metodo Dunder (se esiste) mi permettesse di personalizzare questo comportamento?

Penso che sarebbe __ ottenere __? anche se list() non implementa get/set/delete - credo perché è un built-in?

+0

ho postato una risposta, ma in realtà io non sono sicuro di quello che vuoi dire. Puoi dare un esempio di ciò che vuoi ottenere? Se vuoi mostrare il tuo elenco quando digiti 'a' nella console, allora stai cercando il metodo' __repr__' –

+0

Quello che stai vedendo nella shell interattiva quando inserisci solo il nome è la stringa repr (REPResentational) . Lo stesso con il primo, in cui un elenco reale emette una stringa simile al codice sorgente. Idealmente, 'eval (repr (object))' dovrebbe funzionare per tipi semplici. Quindi non lo stai "accedendo" quando lo mostri in quel modo, ma "lo stringa". – Keith

+0

sì, è esattamente quello che stavo cercando. Ero confuso su quello che stava realmente accadendo lì. – la11111

risposta

4

È necessario eseguire l'override del metodo __repr__ nella propria classe (e facoltativamente anche il metodo __str__), vedere questo post per una discussione sulle differenze.

Qualcosa di simile a questo:

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

Come sottolineato nei commenti, str() chiama __repr__ se __str__ non è definito, ma repr() non chiama __str__ se __repr__ non è definito.

+2

Se si intende implementarne solo uno, implementare '__repr__' piuttosto che' __str__'. 'str' chiama' __repr__' se '__str__' non è definito, ma' repr' non chiama '__str__' se' __repr__' non è definito. – senderle

+0

@senderle grazie per il chiarimento, ho aggiornato la mia risposta –

0

Consentitemi di rispondere alla mia stessa domanda: credo che sia il metodo __ repr __ che sto cercando. Per favore correggimi se sbaglio. Ecco quello che mi si avvicinò con:

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

Suppongo che sia sufficiente "return repr (self.lis)". –

3

Un esempio molto semplice:

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 

uscita:

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