2012-04-28 12 views
5

Ludzie, mam problemy ze zrozumieniem przepływu sterowania w klasie Pythona, tj. Co dzieje się z kodem krok po kroku. Biorąc pod uwagę krótki kod poniżej, chciałbym wiedzieć: kiedy wywoływana jest klasa MainPage, po prostu wykonuje wszystko, co jest w tej klasie? W porządku liniowym? (Pierwszy wiersz, po drugim itd)Problemy ze zrozumieniem przepływu sterowania w klasie Pythona (w silniku aplikacji Google)

enter image description here

+0

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

Odpowiedz

6

Gdy plik Python jest wykonywany, każde zdanie w pliku wykonywany jest od góry do dołu. W twoim przypadku, istnieje sześć stwierdzeń:

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

Pierwsze dwa znaleźć inne moduły Pythona i wykonać wszystkie swoje wypowiedzi, które mogą po prostu zdefiniować kilka klas, a następnie zdefiniować niektóre nazwy w module za pomocą wartości z tych innych modułów. Tak więc po pierwszych dwóch stwierdzeniach zdefiniowaliśmy webapp i run_wsgi_app.

Trzecia instrukcja definiuje klasę MainPage. Robi to poprzez wykonywanie instrukcji wewnątrz ciała klasowego, w tym przypadku jest tylko jeden: a def. Zauważ, że wykonanie instrukcji def nie wykonuje instrukcji w treści funkcji, tylko zbiera te instrukcje do nazwanej funkcji. Kiedy kończy się treść klasy, wszystkie zdefiniowane nazwy stają się atrybutami klasy.

Czwarta instrukcja wywołuje webapp.WSGIApplication i przypisuje wynik do application.

Piąta instrukcja definiuje funkcję o nazwie main.

Szóste oświadczenie wygląda na nazwę __name__. Za każdym razem, gdy wykonywany jest plik Pythona, otrzymuje on zmienną __name__. Jeśli główny plik jest uruchamiany, to jest ten, od którego zaczyna się Python, wartość __name__ to "__main__". Ta instrukcja if jest idiomem oznaczającym "Czy jestem głównym programem?" W tym przypadku tak jest, więc treść instrukcji if również jest wykonywana.

Część instrukcji if po prostu wywołuje funkcję main(), która sama wywołuje funkcję run_wsgi_app, przekazując do niej już zbudowaną wartość application.

Uruchamianie aplikacji WSGI jest zaangażowane, ale zasadniczo oznacza "poczekaj, aż ktoś odwiedzi URL, a następnie zmapuje URL do jakiegoś kodu, a następnie wykonaj kod." W twoim przypadku dostarczyłeś mapę URL powiązaną "/" z MainPage. Gdy ktoś przejdzie do/URL, zostanie utworzony obiekt MainPage i zostanie wywołana metoda na nim.

W szczególności, ponieważ metoda HTTP używana do odwiedzenia/była GET, aplikacja WSGI uruchamia metodę .get() na obiekcie MainPage. Instrukcje w metodzie get są wykonywane sekwencyjnie, zapisując niektóre dane w odpowiedzi. Gdy nie ma więcej instrukcji w ciele funkcji, to zwraca. Kontener aplikacji WSGI przesyła tę odpowiedź z powrotem do przeglądarki!

Ten program nigdy się nie kończy, ponieważ pętle programów WSGI zawsze czekają na następną wizytę URL. Ale jeśli nie, po zakończeniu ostatniej instrukcji w pliku głównym program Python zostanie zakończony, a proces zakończy się.

+0

Dzięki za uwagę i doskonałą odpowiedź, Ned. Wyjaśnił mi kilka innych aspektów. Nadal mam jednak wątpliwości: "Gdy ktoś odwiedza/URL, zostanie utworzony obiekt MainPage, a metoda na nim zostanie wywołana". Kiedy tworzony jest obiekt MainPage, zawsze będzie wykonywał procedury wewnątrz tego obiektu (np. Get, post itp.)? – craftApprentice

+0

Jedynym sposobem, w jaki aplikacja może znaleźć kod do uruchomienia, jest wyszukiwanie obiektu dla metody. Więc tak, zawsze uruchamia metodę na tym obiekcie. –

1

Kod nie jest wykonywany liniowo.

Najpierw należy zdefiniować klasę, która przygotuje dane dla strony po wywołaniu określonej metody (get). Jest to definicja klasy MainPage.

Następnie rejestrujesz tę klasę w systemie, informując jednocześnie, kiedy należy korzystać z tej klasy. Możesz zobaczyć, że dzieje się to na kodzie rozpoczynającym się od application = .... Kod informuje architekturę internetową, aby używała MainPage, gdy ścieżka adresu URL to /. Jak możesz sobie wyobrazić, możesz zarejestrować tutaj wiele klas dla różnych tras. Zauważ, że ten fragment kodu jest wykonywany raz przed wywołaniem main.

Następnie należy zdefiniować punkt wejścia programu: main(). Jest to proste: możesz powiedzieć, że framework zaczyna działać z utworzoną wersją application. Kod pod numerem run_wsgi_app czeka na żądanie, sprawdza ścieżkę URL względem zarejestrowanych klas po otrzymaniu, uzyskuje odpowiedź od zarejestrowanej klasy, wywołując jej metodę get() i wysyła odpowiedź. Oczywiście jest to nadmierne uproszczenie tego, co naprawdę się tam dzieje.

Na koniec wywołujemy połączenie główne w ostatnim bloku kodu.

Podsumowując: najpierw zadzwonić main, który nazywa run_wsgi_app, który instancję MainPage i zwraca jego get() metoda z użyciem struktury application.

+0

Dzięki, vhallac twoje wyjaśnienie jest proste i jasne. Ale chciałbym wiedzieć: dlaczego wywoływana jest funkcja main() i tworzony jest obiekt (pozycja MainPage jest istotna) uruchamia metodę get GDY nie ma wywołania get, a jedynie definicję get (def get (self)) . Nie rozumiem, jak tu przebiega przepływ kontrolny, ponieważ gdyby był to zwykły skrypt funkcyjny, po zdefiniowaniu procedury musiałbym ją nazwać. Czy możesz dać mi wyjaśnienie na ten temat? – craftApprentice

+0

Wywoływacz aplikacji WSGI wywołuje metodę .get(), ponieważ metoda HTTP GET została użyta do odwiedzenia witryny. –

+0

Jeszcze raz dziękuję, Ned. Zaczynam rozumieć, co się dzieje, chociaż "ponieważ metoda HTTP GET została użyta do odwiedzenia strony" nadal brzmi dla mnie trochę niejasno. Ale wiem, że myślę, że z więcej przykładów będę w stanie zrozumieć (z innymi przykładami poza get(), jak post()). Wydaje mi się, że procedura uzyskiwania ma tę lite occult, ale inne procedury (takie jak post()) będą miały wyraźniejsze wywołanie funkcji. Dziękuję za podzielenie się swoją wiedzą i swoim czasem. – craftApprentice

Powiązane problemy