2012-04-28 2 views
5

Leute, ich habe einige Schwierigkeiten, den Kontrollfluss in der Python-Klasse zu verstehen, also was mit dem Code Schritt für Schritt geschieht. Angesichts der kurzen Code unten, würde ich gerne wissen: Wenn die Klasse MainPage aufgerufen wird, führt es nur alles, was in dieser Klasse ist? In linearer Reihenfolge? (Die erste Zeile, nach der zweiten usw.)Problem beim Verständnis des Kontrollflusses in der Python-Klasse (in einer Google App-Engine)

enter image description here

+0

http://webpy.org/docs/0.3/tutorial – dm03514

Antwort

6

Wenn eine Python-Datei ausgeführt wird, wird jede Anweisung in der Datei von oben nach unten ausgeführt wird. In Ihrem Fall sind es sechs Aussagen:

from .. 
from .. 
class MainPage .. 
application = .. 
def main() .. 
if __name__ .. 

Die ersten beiden finden andere Python-Module und alle ihre Anweisungen ausführen, die wahrscheinlich definieren nur eine Reihe von Klassen, und dann einige Namen in Ihrem Modul definieren Werten von diesen anderen Modulen. Also nach den ersten beiden Aussagen haben wir webapp und run_wsgi_app definiert.

Die dritte Anweisung definiert die Klasse MainPage. Dies geschieht durch Ausführen der Anweisungen innerhalb des Klassenkörpers, in diesem Fall gibt es nur einen: a def. Beachten Sie, dass das Ausführen einer def-Anweisung die Anweisungen im Funktionskörper nicht ausführt, sondern nur diese Anweisungen in einer benannten Funktion sammelt. Wenn der Klassenkörper endet, werden alle definierten Namen zu Attributen der Klasse.

Die vierte Anweisung ruft auf und ordnet das Ergebnis application zu. Die fünfte Anweisung definiert eine Funktion mit der Bezeichnung main. Die sechste Anweisung betrachtet den Namen __name__. Jedes Mal, wenn eine Python-Datei ausgeführt wird, erhält sie eine __name__ Variable. Wenn die Datei die Hauptdatei ist, die ausgeführt wird, also die, mit der Python gestartet wurde, lautet der Wert __name__"__main__". Diese if-Anweisung ist ein Idiom mit der Bedeutung "Bin ich das Hauptprogramm?" In diesem Fall ist es so, also wird auch der Rumpf der if-Anweisung ausgeführt.

Der Körper des If ruft einfach die main() Funktion, die selbst die run_wsgi_app Funktion aufruft, übergibt Ihren bereits gebauten application Wert daran.

Das Ausführen einer WSGI-App ist beteiligt, aber im Grunde läuft es ab: "Warten Sie, bis jemand eine URL aufruft, und ordnen Sie dann die URL einem Code zu und führen Sie den Code dann aus." In Ihrem Fall haben Sie eine URL-Zuordnung bereitgestellt, die "/" mit MainPage verknüpft. Sobald jemand die/URL besucht, wird ein MainPage Objekt erstellt und eine Methode wird aufgerufen.

Insbesondere weil die HTTP-Methode, die verwendet wurde, um/GET zu besuchen, ruft der WSGI-App-Runner die .get()-Methode für das MainPage-Objekt auf. Die Anweisungen in der get Methode werden nacheinander ausgeführt, indem einige Daten in die Antwort geschrieben werden. Wenn im Funktionskörper keine weiteren Anweisungen vorhanden sind, wird zurückgegeben. Der WSGI-Anwendungscontainer sendet diese Antwort an den Webbrowser zurück!

Dieses Programm endet nie, weil der WSGI-Anwendungs-Runner für immer auf den nächsten URL-Besuch wartet. Wenn dies nicht der Fall wäre, wäre das Python-Programm nach Abschluss der letzten Anweisung in Ihrer Hauptdatei fertig und der Prozess würde enden.

+0

Danke für Ihre Aufmerksamkeit und ausgezeichnete Antwort, Ned. Es hat mir einige andere Aspekte klargemacht. Aber ich zweifle immer noch daran: "Sobald jemand die/URL besucht, wird ein MainPage-Objekt erstellt und eine Methode darauf aufgerufen". Wenn das MainPage-Objekt erstellt wird, wird es immer die Prozeduren innerhalb dieses Objekts (wie Get, Post usw.) ausgeführt? – craftApprentice

+0

Die App kann Code nur finden, wenn sie nach einem Objekt für eine Methode sucht. Also ja, es wird immer eine Methode für dieses Objekt ausgeführt. –

1

Der Code wird nicht linear ausgeführt.

Zuerst definieren Sie eine Klasse, die Daten für eine Seite vorbereitet, wenn eine bestimmte Methode (get) aufgerufen wird. Dies ist die Klassendefinition von MainPage.

Dann registrieren Sie diese Klasse mit dem System und auch, wenn Sie diese Klasse verwenden. Sie können sehen, dass das auf dem Code geschieht, der mit application = ... beginnt. Der dort angegebene Code weist das Webapp-Framework an, MainPage zu verwenden, wenn der URL-Pfad / lautet. Wie Sie sich vorstellen können, können Sie hier mehrere Klassen für verschiedene Routen registrieren. Beachten Sie, dass dieser Codecode einmal ausgeführt wird, bevor main aufgerufen wird.

Dann definieren Sie den Programmeinstiegspunkt: main(). Es ist ein einfaches: Sie sagen dem Framework, dass es mit dem von Ihnen erstellten application startet. Der Code unter run_wsgi_app wartet auf eine Anforderung, überprüft den URL-Pfad für registrierte Klassen, wenn er einen empfängt, erhält eine Antwort von der registrierten Klasse durch Aufrufen seiner get()-Methode und sendet eine Antwort. Natürlich ist dies eine grobe Vereinfachung des tatsächlichen Geschehens.

Schließlich rufen Sie main im letzten Codeblock auf.

Zusammengefasst: wir main zuerst nennen, die run_wsgi_app nennt, die eine MainPage instanziiert und nennt seine get() Methode, um die Struktur application verwenden.

+0

Danke, vhallac Ihre Erklärung ist einfach und klar. Aber ich würde gerne wissen: warum wenn main() aufgerufen wird und ein Objekt erstellt wird (MainPage is itsantitiated), führt es die Methode get aus WENN es nichts gibt, was get ruft, sondern nur eine Definition von get (def get (self)) . Ich verstehe nicht, wie der Kontrollfluss hier abläuft, denn wenn es ein gewöhnliches Funktionsskript wäre, müsste ich es nach dem Definieren einer Prozedur aufrufen. Könnten Sie mir eine Erklärung dazu geben? – craftApprentice

+0

Der WSGI-App-Runner ruft .get() auf, weil die HTTP-Methode GET zum Aufrufen der Site verwendet wurde. –

+0

Danke einmal mehr, Ned. Ich beginne zu verstehen, was passiert, obwohl "weil die HTTP-Methode GET verwendet wurde, um die Seite zu besuchen" immer noch ein wenig dunkel für mich klingen. Aber ich denke, dass ich mit mehr Beispielen verstehen werde (mit anderen Beispielen jenseits von get(), wie post()). Ich denke, get Verfahren hat dies eine kleine okkulte genannt, aber andere Verfahren (wie post()) wird eine klarere Funktionsaufruf haben. Danke, dass Sie Ihr Wissen und Ihre Zeit geteilt haben. – craftApprentice