Wie schreibe ich eine Generatorklasse?

9

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?

    
Pritam 23.03.2017, 17:56
quelle

4 Antworten

16
  

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__ :

%Vor%

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:

%Vor%
  

Wie schreibe ich auch Unittest für Generatoren?

Sie müssen für eine Generator

immer noch eine Methode zum Senden und Werfen implementieren %Vor%

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 ):

%Vor%

und mit den gleichen Tests oben:

%Vor%

Python 2

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.

%Vor%

Beachten Sie, dass ich close direkt aus der Python 3 Standardbibliothek kopiert habe, ohne Änderung.

    
Aaron Hall 23.03.2017, 18:07
quelle
2

Verwenden Sie nicht yield in __next__ function und implementieren Sie next auch für die Kompatibilität mit python2.7 +

Code

%Vor%     
Sarath Sadasivan Pillai 23.03.2017 18:08
quelle
1

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%     
martineau 23.03.2017 18:13
quelle
0

__next__ sollte ein Element zurückgeben , nicht nachgeben.

Sie können entweder Folgendes schreiben, wobei Fib.__iter__ einen geeigneten Iterator zurückgibt:

%Vor%

oder machen Sie jede Instanz selbst zu einem Iterator, indem Sie __next__ definieren.

%Vor%     
chepner 23.03.2017 18:06
quelle

Tags und Links