Verständnis __getitem__ - Methode
Ich habe durch die meisten der Dokumentation von __getitem__
in der Python-docs und auch bei stackoverflow so ist dies nicht eine doppelte Frage. Aber ich bin noch nicht in der Lage zu begreifen, die Bedeutung.
Also alles, was ich verstehen kann ist, dass __getitem__
die Umsetzung der Aufrufe, wie self[key]
. Aber was nützt es?
Können sagen, ich habe eine python-Klasse in dieser Weise definiert:
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"])
Dieser liefert die Ergebnisse wie erwartet. Aber warum __getitem__
in den ersten Platz? Ich habe auch gehört, dass Python ruft __getitem__
intern. Aber warum tut er das?
Kann mir bitte jemand dies genauer erklären?
Dies kann von Interesse sein für ein Beispiel verwenden: Wie man richtig Unterklasse dict und überschreiben Sie getitem & setitem
Die
Die
__getitem__
verwenden, in Ihrem Beispiel nicht viel Sinn machen, aber stellen Sie sich vor, Sie schreiben eine benutzerdefinierte Liste - oder dictionary-wie Klasse, das hat die Arbeit mit den bestehenden code, der verwendet []
. Das ist eine situation, wo __getitem__
nützlich ist.InformationsquelleAutor user1867151 | 2017-04-26
Du musst angemeldet sein, um einen Kommentar abzugeben.
Cong Ma macht einen guten job zu erklären, was "getitem " - aber ich möchte Ihnen ein Beispiel zu geben, die nützlich sein könnten.
Stellen Sie sich eine Klasse, die Modelle zu bauen. Innerhalb der Daten für das Gebäude enthält es eine Reihe von Parametern, einschließlich Beschreibungen der Firmen, die besetzen jede Etage :
Ohne Verwendung
__getitem__
wir hätten eine Klasse wie folgt aus :Konnten wir jedoch
__getitem__
(und Ihr Gegenstück__setitem__
), um die Nutzung des Gebäudes Klasse 'schöner'.Ob Sie
__setitem__
wie dieses hängt wirklich davon ab, wie Sie planen, zu abstrahieren, Ihre Daten - in diesem Fall haben wir beschlossen, Sie zu behandeln, ein Gebäude, die als container für Boden (und man könnte auch implementieren Sie einen iterator für die Gebäude und vielleicht sogar die Fähigkeit zu schneiden, D. H. mehr als ein Stockwerk, die Daten in einer Zeit - es hängt davon ab, was Sie brauchen.building1[2]
, die sich selbst aufrufen ruft intern die getitem. So ist der Punkt @tony-suffolk-66 macht ist, dass jede Eigenschaft/variable der Klasse abgerufen werden kann während der Laufzeit durch den Aufruf einfach objectname[variablename]. Nur mit der Klärung dieser da war es nicht klar für mich anfangs und schreiben Sie es hier, in der Hoffnung es hilft jemand. Löschen, falls überflüssig bittedas Objekt[index] - notation nicht verwendet, um eine Eigenschaft/variable/Attribut einer Klasse - es isindexing auf ein container-Objekt - zum Beispiel das abrufen von ein child-Objekt aus einem übergeordneten, wo die Eltern verwaltet eine Liste seiner Kinder. In meinem Beispiel - der Bau der Klasse ist ein container (in diesem Fall der Boden Namen), aber es könnte eine container-Klasse für Stock-Klassen.
InformationsquelleAutor Tony Suffolk 66
Den
[]
syntax für das erste Element durch Schlüssel oder index ist nur syntax-Zucker.Wenn Sie bewerten
a[i]
Python rufta.__getitem__(i)
(odertype(a).__getitem__(a, i)
, aber diese Unterscheidung ist über die Vererbung Modelle und ist hier nicht wichtig). Auch wenn die Klassea
kann nicht explizit definieren, diese Methode, es ist in der Regel vererbt, die aus einer Vorfahren-Klasse.Alle (Python 2.7) spezielle Methode Namen und Ihre Semantik sind hier aufgelistet: https://docs.python.org/2.7/reference/datamodel.html#special-method-names
InformationsquelleAutor Cong Ma