De getitem methode werd aan Python toegevoegd als onderdeel van het protocol voor sequenties en mappings. Met deze magische methode ondersteunen standaardcollecties (list, tuple, dict enz.) toegang op index, sleutel en slice. In gebruikersklassen stelt deze methode objecten in staat om zich te gedragen "als collecties".
Zonder de implementatie van getitem ondersteunt een gebruikersklasse geen indexering of iteratie met for. De implementatie alleen voor eenvoudige indices is niet toepasbaar als we volledige ondersteuning voor slices willen, en het negeren van verschillende indexvarianten leidt tot fouten.
Implementeer getitem om zowel indices als slice-objecten te ondersteunen, en verwerk ze apart. Dit maakt het mogelijk om gebruikersobjecten te gebruiken in standaardconstructies van Python (bijvoorbeeld, om slices te ondersteunen zoals your_obj[1:5]).
Codevoorbeeld:
class MyRange: def __init__(self, n): self.n = n def __getitem__(self, item): if isinstance(item, int): # Individuele 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('Ongeldig argumenttype: {}'.format(type(item))) mr = MyRange(10) print(mr[3]) # 6 print(mr[2:5]) # [4, 6, 8]
Belangrijke kenmerken:
Biedt de implementatie van alleen getitem de mogelijkheid om waarden op index toe te wijzen?
Nee. Voor ondersteuning van toewijzing (your_obj[i] = waarde) moet setitem worden geïmplementeerd. getitem is alleen verantwoordelijk voor lezen.
Moet getitem altijd een lijst retourneren voor een slice, zoals list?
Nee. Het belangrijkste is dat er een "sequentie" wordt geretourneerd, rekening houdend met de betekenis van de klasse (je kunt hetzelfde type of bijvoorbeeld een tuple retourneren). Het is belangrijk dat dit logisch is in de context van de taak.
Waarom verschijnt soms de foutmelding TypeError: 'MyClass' object is not subscriptable?
Deze melding verschijnt als je probeert my_obj[0] uit te voeren, terwijl de klasse getitem niet implementeert. Om een klasse subscriptable te maken (ondersteunt []), is deze methode vereist.
Geïmplementeerd getitem alleen voor int, vergeten om slice te verwerken. Elke poging my_obj[2:5] leidt tot TypeError en het falen van het gehele collectieverwerkingsalgoritme.
Voordelen:
Nadelen:
getitem is geïmplementeerd met aparte verwerking voor slice en int. Slices en indices werken, methods list(), map(), itereren worden ondersteund zonder extra inspanning.
Voordelen:
Nadelen: