2013-04-16 16 views
13

robię klasy jak poniżej:Jak zastąpić funkcjonalność plasterka listy w swojej klasie pochodnej

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

chcę funkcjonalność plaster zostać zmienione w listy podr

+0

Sprawdź to: http://stackoverflow.com/questions/2936863/python-implementing-slicing-in-getitem –

+0

http://stackoverflow.com/questions/ 1957780/python-overloading-the-operator-getitem-method ... kiedy poszedłem głosować, aby zamknąć, źle złą sprawę ... powinienem być jako duplikat tego. –

Odpowiedz

27

Musisz podać zwyczaj __getitem__(), __setitem__ i __delitem__ haczyków.

Są one przekazywane slice object podczas krojenia listy; mają one start, stop i step atrybuty (które mogłyby być 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] 

lub, w Twoim przypadku:

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

ponieważ list może podjąć bezpośrednio obiekt slice.

W języku Python 2, list.__getslice__ jest wywoływana dla plasterków bez kroku (tak więc tylko indeksy uruchamiania i zatrzymywania), jeśli jest zaimplementowany, a wbudowany typ list implementuje go, więc trzeba to również zastąpić; proste przekazanie do metody __getitem__ powinien robić dobrze:

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

nie ma większego sensu ... self jest sam przedmiot lista, i to już zostało stworzone w tym momencie, może chcesz zastąpić __new__, jednak prawdopodobnie nie musisz tego dotykać. Zresztą chcesz nadpisać __getitem__ tak:

def __getitem__(self, val): 
    if isinstance(val, slice): 
     # do stuff here 
Powiązane problemy