Ich sehe viele Beispiele für Generatorfunktionen, aber ich möchte wissen, wie man Generatoren für Klassen schreibt. Sagen wir mal, ich wollte Fibonacci-Serie als Klasse schreiben.
%Vor%Ausgabe:
%Vor% Warum wird der Wert self.a
nicht gedruckt? Wie schreibe ich unittest
für Generatoren?
Wie schreibe ich eine Generatorklasse?
Sie sind fast da, schreiben eine Iterator Klasse (Ich zeige einen Generator am Ende der Antwort), aber __next__
wird jedes Mal aufgerufen, wenn Sie das Objekt mit next
aufrufen, Rückgabe eines Generatorobjekts. Verwenden Sie stattdessen __iter__
:
Um die Klasse selbst zu einem Iterator zu machen:
%Vor%Und jetzt:
%Vor%Warum wird der Wert self.a nicht gedruckt?
Hier ist Ihr ursprünglicher Code mit meinen Kommentaren:
%Vor% Jedes Mal, wenn Sie next(f)
aufgerufen haben, haben Sie das Generatorobjekt erhalten, das __next__
zurückgibt:
Wie schreibe ich auch Unittest für Generatoren?
Sie müssen für eine Generator
Und jetzt:
%Vor% Lassen Sie uns also ein Generatorobjekt implementieren und nutzen Sie die abstrakte Basisklasse Generator
aus dem Auflistungsmodul (siehe die Quelle für Implementierung ), was bedeutet, dass wir nur send
und throw
implementieren müssen und uns close
, __iter__
(returns self) und __next__
( Gleich wie .send(None)
) kostenlos (siehe Python-Datenmodell für Koroutinen ):
und mit den gleichen Tests oben:
%Vor% Das ABC Generator
existiert nur in Python 3. Um dies ohne Generator
zu tun, müssen wir mindestens close
, __iter__
und __next__
zusätzlich zu den oben definierten Methoden schreiben.
Beachten Sie, dass ich close
direkt aus der Python 3 Standardbibliothek kopiert habe, ohne Änderung.
Verwenden Sie nicht yield
in __next__
function und implementieren Sie next
auch für die Kompatibilität mit python2.7 +
Code
%Vor% Wenn Sie der Klasse eine __iter__()
-Methode als Generator zur Verfügung stellen , Es wird automatisch ein Generatorobjekt zurückgeben, wenn es aufgerufen wird, so dass das -Objekt die Methoden __iter__
und __next__
verwendet werden.
Folgendes meine ich:
%Vor%Ausgabe:
%Vor%