Ich versuche, die Slice-Funktionalität für eine Klasse zu implementieren, die eine Vektordarstellung erstellt.
Ich habe diesen Code bis jetzt, von dem ich glaube, dass er das Slice richtig implementiert, aber wenn ich einen Aufruf wie v[4]
v einen Vektorpython mache, wird ein Fehler zurückgegeben, dass nicht genügend Parameter vorhanden sind. Ich versuche also herauszufinden, wie ich die getitem
spezielle Methode in meiner Klasse definieren kann, um sowohl einfache Indizes als auch Slicing zu verarbeiten.
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
Nikotin
quelle
quelle
__getslice__
für Python 2.X-Versionen implementieren . siehe docs.python.org/2/reference/datamodel.html#object.__getslice____get/set/delslice__
. Es ist jedoch ziemlich subtil.Ich habe eine "synthetische" Liste (eine, in der die Daten größer sind, als Sie im Speicher erstellen möchten), und meine
__getitem__
sieht folgendermaßen aus:Das Slice gibt nicht den gleichen Typ zurück, was ein Nein-Nein ist, aber es funktioniert für mich.
quelle
Slice - Objekte automatisch erstellt wird , wenn Sie einen Doppelpunkt in der Index - Notation verwenden - und das ist das, was passiert ist
__getitem__
. Verwendenisinstance
Sie diese Option , um zu überprüfen, ob Sie ein Slice-Objekt haben:Angenommen, wir haben ein Bereichsobjekt verwendet, möchten jedoch, dass Slices Listen anstelle neuer Bereichsobjekte zurückgeben (wie dies der Fall ist):
Wir können den Bereich aufgrund interner Einschränkungen nicht unterordnen, aber wir können ihn delegieren:
Wir haben kein perfekt austauschbares Range-Objekt, aber es ist ziemlich nah:
Um die Slice-Notation besser zu verstehen, sehen Sie hier die Verwendung von Sliceable:
Python 2, sei dir bewusst:
In Python 2 gibt es eine veraltete Methode, die Sie möglicherweise überschreiben müssen, wenn Sie einige integrierte Typen unterklassifizieren.
Aus der Dokumentation zum Datenmodell :
Dies ist in Python 3 weg.
quelle
Um Aarons Antwort zu erweitern
numpy
, können Sie beispielsweise mehrdimensionale Schnitte durchführen, indem Sie prüfen, obgiven
es sich um Folgendes handelttuple
:`` `
Ausgabe:
quelle
Der richtige Weg, dies zu tun, besteht darin
__getitem__
, einen Parameter zu nehmen, der entweder eine Zahl oder ein Slice-Objekt sein kann.Sehen:
http://docs.python.org/library/functions.html#slice
http://docs.python.org/reference/datamodel.html#object.__getitem__
quelle