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
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
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))
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
Sprawdź to: http://stackoverflow.com/questions/2936863/python-implementing-slicing-in-getitem –
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. –