Ich habe den größten Teil der Dokumentation von durchgesehen __getitem__
in den Python-Dokumenten , kann aber immer noch nicht verstehen, was das bedeutet.
Alles was ich verstehen kann ist, dass __getitem__
es verwendet wird, um Aufrufe wie zu implementierenself[key]
. Aber wozu dient es?
Nehmen wir an, ich habe eine Python-Klasse, die folgendermaßen definiert ist:
class Person:
def __init__(self,name,age):
self.name = name
self.age = age
def __getitem__(self,key):
print ("Inside `__getitem__` method!")
return getattr(self,key)
p = Person("Subhayan",32)
print (p["age"])
Dies gibt die Ergebnisse wie erwartet zurück. Aber warum überhaupt verwenden __getitem__
? Ich habe auch gehört, dass Python __getitem__
intern anruft . Aber warum macht es das?
Kann jemand dies bitte genauer erklären?
__getitem__
Verwendung in Ihrem Beispiel macht nicht viel Sinn, aber stellen Sie sich vor, Sie müssen eine benutzerdefinierte listen- oder wörterbuchähnliche Klasse schreiben, die mit vorhandenem Code arbeiten muss, der verwendet wird[]
. Das ist eine Situation, in der__getitem__
es nützlich ist.Antworten:
Cong Ma erklärt sehr gut, was
__getitem__
verwendet wird - aber ich möchte Ihnen ein Beispiel geben, das nützlich sein könnte. Stellen Sie sich eine Klasse vor, die ein Gebäude modelliert. In den Daten für das Gebäude sind eine Reihe von Attributen enthalten, einschließlich Beschreibungen der Unternehmen, die jede Etage belegen:Ohne Verwendung hätten
__getitem__
wir eine Klasse wie diese:Wir könnten jedoch
__getitem__
(und sein Gegenstück__setitem__
) verwenden, um die Verwendung der Gebäudeklasse "schöner" zu machen.Ob Sie
__setitem__
dies verwenden, hängt wirklich davon ab, wie Sie Ihre Daten abstrahieren möchten. In diesem Fall haben wir beschlossen, ein Gebäude als Container mit Etagen zu behandeln (und Sie könnten auch einen Iterator für das Gebäude implementieren und möglicherweise sogar die Fähigkeit zum Schneiden - dh mehr als eine Etage gleichzeitig abrufen - das hängt davon ab, was Sie benötigen.quelle
building1[2]
diesen Anruf selbst anruft , ruft er intern das getitem auf. Der Punkt, den @ tony-suffolk-66 macht, ist, dass jede Eigenschaft / Variable der Klasse zur Laufzeit durch einfaches Aufrufen des Objektnamens [Variablenname] abgerufen werden kann. Ich habe das nur geklärt, da es mir anfangs nicht klar war, und es hier geschrieben, in der Hoffnung, dass es jemandem hilft. Löschen Sie, wenn überflüssig bittelen()
, und Sie erhalten eineTypeError
:TypeError: object of type 'Building' has no len()
Die
[]
Syntax zum Abrufen eines Elements nach Schlüssel oder Index ist nur Syntaxzucker.Wenn Sie bewerten
a[i]
Python-Aufrufea.__getitem__(i)
(odertype(a).__getitem__(a, i)
, aber diese Unterscheidung betrifft Vererbungsmodelle und ist hier nicht wichtig). Auch wenn die Klasse vona
diese Methode möglicherweise nicht explizit definiert, wird sie normalerweise von einer Vorgängerklasse geerbt.Alle (Python 2.7) speziellen Methodennamen und ihre Semantik sind hier aufgelistet: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
quelle
Die magische Methode
__getitem__
wird im Wesentlichen für den Zugriff auf Listenelemente, Wörterbucheinträge, Array-Elemente usw. verwendet. Sie ist sehr nützlich für die schnelle Suche nach Instanzattributen.Hier zeige ich dies anhand einer Beispielklasse Person, die durch 'Name', 'Alter' und 'Dob' (Geburtsdatum) instanziiert werden kann. Die
__getitem__
Methode ist so geschrieben, dass auf die indizierten Instanzattribute wie Vor- oder Nachname, Tag, Monat oder Jahr des Dob usw. zugegriffen werden kann.Angenommen, eine Benutzereingabe lautet wie folgt:
Mit Hilfe der
__getitem__
Methode kann der Benutzer auf die indizierten Attribute zugreifen. z.B,quelle