2013-04-16 10 views
13

Faccio una classe come di seguito:come ignorare la funzionalità fetta di lista nella sua classe derivata

class MyList(list): 
    def __init__(self, lst): 
     self.list = lst 

voglio funzionalità fetta di essere sovrascritta in MyList

+0

Controllare questo: http://stackoverflow.com/questions/2936863/python-implementing-slicing-in-getitem –

+0

http://stackoverflow.com/questions/ 1957780/python-overloading-the-operator-getitem-metodo ... quando sono andato a votare per chiudere, ho sbagliato il motivo sbagliato ... dovrebbe essere un duplicato di questo. –

risposta

27

È necessario fornire personalizzato __getitem__(), __setitem__ e ganci __delitem__.

Questi sono passati a slice object quando si affetta l'elenco; questi hanno start, stop e step attributi (che potrebbe essere None):

def __getitem__(self, key): 
    if isinstance(key, slice): 
     return [self.list[i] for i in xrange(key.start, key.stop, key.step)] 
    return self.list[key] 

o, per il vostro caso:

def __getitem__(self, key): 
    return self.list[key] 

perché un list può prendere direttamente l'oggetto slice.

In Python 2, list.__getslice__ viene chiamato per le slice senza passo (quindi solo start e stop indici) se implementato, e il tipo integrato list implementa il codice in modo da doverlo anche sovrascrivere; una semplice delega al metodo __getitem__ dovrebbe fare bene:

def __getslice__(self, i, j): 
    return self.__getitem__(slice(i, j)) 
2
class MyList(list): 
    def __init__(self, lst): 
     self.list = lst 

non ha molto senso ... self è l'oggetto lista stessa, ed è già stato creato a questo punto, forse si vuole per sovrascrivere __new__, tuttavia probabilmente non è necessario toccarlo. In ogni caso si desidera ignorare __getitem__ in questo modo:

def __getitem__(self, val): 
    if isinstance(val, slice): 
     # do stuff here 
Problemi correlati