Ich habe ein benutzerdefiniertes Containerobjekt geschrieben.
Laut dieser Seite muss ich diese Methode auf meinem Objekt implementieren:
__iter__(self)
Wenn Sie jedoch dem Link zu Iteratortypen im Python-Referenzhandbuch folgen , werden keine Beispiele für die Implementierung Ihrer eigenen Typen angegeben.
Kann jemand ein Snippet (oder einen Link zu einer Ressource) posten, das zeigt, wie das geht?
Der Container, den ich schreibe, ist eine Karte (dh speichert Werte durch eindeutige Schlüssel). Diktate können folgendermaßen wiederholt werden:
for k, v in mydict.items()
In diesem Fall muss ich in der Lage sein, zwei Elemente (ein Tupel?) Im Iterator zurückzugeben. Es ist immer noch nicht klar, wie ein solcher Iterator implementiert werden soll (trotz der verschiedenen Antworten, die freundlicherweise zur Verfügung gestellt wurden). Könnte jemand bitte etwas mehr Licht in die Implementierung eines Iterators für ein kartenähnliches Containerobjekt bringen? (dh eine benutzerdefinierte Klasse, die sich wie ein Diktat verhält)?
some_list
ergeben wurden.some_list
erschöpft sind.StopIteration
wird von Python automatisch ausgelöst, wenn die Generatorfunktion zurückkehrt, entweder durch expliziten Aufrufreturn
oder durch Erreichen des Endes der Funktion (die wie alle Funktionenreturn None
am Ende ein implizites Element hat ). Ein explizites ErhöhenStopIteration
ist nicht erforderlich und ab Python 3.5 funktioniert es tatsächlich nicht mehr (siehe PEP 479 ): Genau wie Generatorenreturn
werdenStopIteration
sie explizitraise StopIteration
zu aRuntimeError
.Eine andere Möglichkeit besteht darin, von der entsprechenden abstrakten Basisklasse aus dem hier dokumentierten Modul `collection zu erben .
Falls der Container ein eigener Iterator ist, können Sie von erben
collections.Iterator
. Sie müssen dienext
Methode dann nur noch implementieren .Ein Beispiel ist:
Wenn Sie sich das
collections
Modul ansehenSequence
, sollten Sie in Betracht ziehen , vonMapping
oder einer anderen abstrakten Basisklasse zu erben , wenn dies angemessener ist. Hier ist ein Beispiel für eineSequence
Unterklasse:NB : Vielen Dank an Glenn Maynard, der mich darauf aufmerksam gemacht hat, dass der Unterschied zwischen Iteratoren einerseits und Containern, die eher iterabel als iterativ sind, geklärt werden muss.
quelle
__iter__()
Geben Sie normalerweise nur self zurück, wenn Sie bereits die next () -Methode (Generatorobjekt) definiert haben:Hier ist ein Dummy-Beispiel eines Generators:
sondern
__iter__()
kann auch wie folgt verwendet werden: http://mail.python.org/pipermail/tutor/2006-January/044455.htmlquelle
Wenn Ihr Objekt einen Datensatz enthält, an den Sie den Iter Ihres Objekts binden möchten, können Sie Folgendes tun:
quelle
hasattr
, verwenden Sietry/except AttributeError
Die "iterable Schnittstelle" in Python besteht aus zwei Methoden
__next__()
und__iter__()
. Die__next__
Funktion ist die wichtigste, da sie das Iteratorverhalten definiert. Das heißt, die Funktion bestimmt, welcher Wert als nächstes zurückgegeben werden soll. Die__iter__()
Methode wird verwendet, um den Startpunkt der Iteration zurückzusetzen. Oft werden Sie feststellen, dass Sie__iter__()
sich einfach selbst zurückgeben können, wenn Sie__init__()
den Startpunkt festlegen.Im folgenden Code finden Sie Informationen zum Definieren einer Klassenumkehr, die die "iterierbare Schnittstelle" implementiert und einen Iterator über eine beliebige Instanz einer beliebigen Sequenzklasse definiert. Die
__next__()
Methode beginnt am Ende der Sequenz und gibt Werte in umgekehrter Reihenfolge der Sequenz zurück. Beachten Sie, dass Instanzen einer Klasse, die die "Sequenzschnittstelle" implementiert, eine__len__()
und eine__getitem__()
Methode definieren müssen .quelle
Um die Frage zu Zuordnungen zu beantworten : Ihre bereitgestellten
__iter__
sollten die Schlüssel der Zuordnung durchlaufen . Das folgende Beispiel zeigt ein einfaches Mappingx -> x * x
und arbeitet mit Python3, um das ABC-Mapping zu erweitern.quelle
Falls Sie nicht erben möchten,
dict
wie andere vorgeschlagen haben, finden Sie hier eine direkte Antwort auf die Frage, wie Sie__iter__
ein grobes Beispiel für ein benutzerdefiniertes Diktat implementieren können :Das nutzt einen Generator, der gut beschrieben ist hier .
Da wir von erben
Mapping
, müssen Sie auch implementieren__getitem__
und__len__
:quelle
Eine Option , die für manche Fälle funktionieren könnte zu Ihrer benutzerdefinierten Klasse machen erbt aus
dict
. Dies scheint eine logische Entscheidung zu sein, wenn es sich wie ein Diktat verhält. Vielleicht sollte es ein Diktat sein. Auf diese Weise erhalten Sie kostenlos eine diktierte Iteration.Ausgabe:
quelle
Beispiel für das Erben von dict, ändern Sie die
iter
Überspring-Taste,2
wenn Sie sich in der for-Schleife befindenquelle