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
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
È 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))
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
Controllare questo: http://stackoverflow.com/questions/2936863/python-implementing-slicing-in-getitem –
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. –