Die Methode getitem wurde als Teil des Protokolls für Sequenzen und Zuordnungen in Python eingeführt. Mit dieser magischen Methode unterstützen Standardkollektionen (list, tuple, dict usw.) den Zugriff über Indizes, Schlüssel und Slices. In benutzerdefinierten Klassen ermöglicht diese Methode es Objekten, sich "wie Kollektionen" zu verhalten.
Ohne die Implementierung von getitem unterstützt eine benutzerdefinierte Klasse keine Indizierung und keine Iteration mit for. Eine Implementierung nur für einfache Indizes ist nicht anwendbar, wenn man eine vollständige Funktionalität mit Slices haben möchte, und das Ignorieren von Varianten des Index führt zu Fehlern.
Implementiere getitem zur Unterstützung sowohl von Indizes als auch von Objekten vom Typ slice, indem man diese in der Verarbeitung trennt. Dadurch kann man benutzerdefinierte Objekte in Standardkonstruktionen von Python verwenden (zum Beispiel zur Unterstützung von Slices wie your_obj[1:5]).
Beispielcode:
class MyRange: def __init__(self, n): self.n = n def __getitem__(self, item): if isinstance(item, int): # Individueller Index if 0 <= item < self.n: return item * 2 raise IndexError('index out of range') elif isinstance(item, slice): # Slice return [self[i] for i in range(*item.indices(self.n))] else: raise TypeError('Ungültiger Argumenttyp: {}'.format(type(item))) mr = MyRange(10) print(mr[3]) # 6 print(mr[2:5]) # [4, 6, 8]
Wichtige Merkmale:
Ermöglicht die Implementierung von nur getitem das Zuweisen von Werten über Indizes?
Nein. Um Zuweisungen zu unterstützen (your_obj[i] = value), muss setitem implementiert werden. getitem ist nur für das Lesen zuständig.
Muss getitem unbedingt eine Liste für den Slice zurückgeben, wie list?
Nein. Entscheidend ist, eine "Sequenz" im Sinne der Klasse zurückzugeben (man kann denselben Typ oder zum Beispiel ein tuple zurückgeben). Wichtig ist, dass es im Kontext der Aufgabe sinnvoll ist.
Warum tritt manchmal der Fehler TypeError: 'MyClass' object is not subscriptable auf?
Diese Meldung tritt auf, wenn Sie versuchen, my_obj[0] auszuführen und die Klasse getitem nicht implementiert. Damit eine Klasse subscriptable (unterstützt []) ist, ist diese Methode erforderlich.
getitem wurde nur für int implementiert, slice wurde vergessen. Jeder Versuch, my_obj[2:5] auszuführen, führt zu einem TypeError und einem Ausfall des gesamten Sammlungverarbeitungsalgorithmus.
Vorteile:
Nachteile:
getitem ist mit separater Verarbeitung für slice und int implementiert. Slices und Indizes funktionieren, die Methoden list(), map() und Iteration werden ohne zusätzlichen Aufwand unterstützt.
Vorteile:
Nachteile: