Próbuję zaimplementować funkcjonalność wycinka dla klasy, którą tworzę, która tworzy reprezentację wektorową.
Do tej pory mam ten kod, który, jak sądzę, prawidłowo zaimplementuje wycinek, ale za każdym razem, gdy wykonuję wywołanie, takie jak v[4]
gdzie v jest wektorem, Python zwraca błąd o braku wystarczających parametrów. Więc próbuję dowiedzieć się, jak zdefiniować getitem
specjalną metodę w mojej klasie do obsługi zarówno zwykłych indeksów, jak i wycinania.
def __getitem__(self, start, stop, step):
index = start
if stop == None:
end = start + 1
else:
end = stop
if step == None:
stride = 1
else:
stride = step
return self.__data[index:end:stride]
python
slice
python-datamodel
nikotyna
źródło
źródło
__getslice__
dla wersji Python 2.X. zobacz docs.python.org/2/reference/datamodel.html#object.__getslice____get/set/delslice__
. Jest to jednak dość subtelne.Mam listę „syntetyczną” (taką, w której dane są większe niż chciałbyś utworzyć w pamięci) i
__getitem__
wygląda to tak:Kawałek nie zwraca tego samego typu, czyli nie, nie, ale dla mnie działa.
źródło
Obiekty plasterków są tworzone automatycznie, gdy używasz dwukropka w notacji indeksu dolnego - i to jest to, co jest przekazywane do
__getitem__
. Użyj,isinstance
aby sprawdzić, czy masz obiekt plasterka:Powiedzmy, że używaliśmy obiektu zakresu, ale chcemy, aby plasterki zwracały listy zamiast nowych obiektów zakresu (tak jak to się dzieje):
Nie możemy podklasować zakresu z powodu wewnętrznych ograniczeń, ale możemy delegować do niego:
Nie mamy doskonale wymiennego obiektu Range, ale jest dość blisko:
Aby lepiej zrozumieć notację plasterków, oto przykład użycia Sliceable:
Python 2, pamiętaj:
W Pythonie 2 istnieje przestarzała metoda, którą może być konieczne zastąpienie podczas tworzenia podklas niektórych typów wbudowanych.
Z dokumentacji modelu danych :
To zniknęło w Pythonie 3.
źródło
Aby rozszerzyć odpowiedź Aarona, na przykład
numpy
możesz wykonać wielowymiarowe cięcie, sprawdzając, czygiven
jesttuple
:`` ''
Wynik:
źródło
Prawidłowym sposobem jest
__getitem__
pobranie jednego parametru, którym może być liczba lub obiekt wycinka.Widzieć:
http://docs.python.org/library/functions.html#slice
http://docs.python.org/reference/datamodel.html#object.__getitem__
źródło