2012-04-28 1 views
5

Ребята, у меня возникли проблемы с пониманием потока управления в классе python, т. Е. Что происходит с кодом шаг за шагом. Учитывая короткий код ниже, я хотел бы знать: когда класс MainPage называется, он просто выполняет все, что находится внутри этого класса? В линейном порядке? (Первая строка, после второго и т.д.)Неисправность в понимании потока управления в классе python (в движке Google)

enter image description here

+0

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

ответ

6

Когда файл Python выполняется, каждый оператор в файле выполняется сверху вниз. В вашем случае, есть шесть заявлений:

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

Первые два найти другие модули Python и выполнять все их заявления, которые, вероятно, просто определяют кучу классов, а затем определить некоторые имена в модуле, используя значения из этих других модулей. Итак, после первых двух утверждений мы определили webapp и run_wsgi_app.

Третий оператор определяет класс MainPage. Он делает это, выполняя утверждения внутри тела класса, в этом случае есть только один: a def. Обратите внимание, что выполнение инструкции def не выполняет инструкции в теле функции, она просто собирает эти выражения в именованную функцию. Когда тело класса заканчивается, все указанные имена становятся атрибутами класса.

Четвертый оператор вызывает webapp.WSGIApplication и присваивает результат application.

Пятый оператор определяет функцию, называемую main.

В шестом заявлении рассматривается имя __name__. Каждый раз, когда выполняется файл Python, ему присваивается переменная __name__. Если файл является основным, который запускается, то есть, с первого запуска Python, значение __name__ равно "__main__". Это утверждение if является идиомой, означающей: «Я - главная программа?» В этом случае это так, поэтому выполняется и тело оператора if.

Тело функции if просто вызывает функцию main(), которая сама вызывает функцию run_wsgi_app, передавая ей уже построенное значение application.

Запуск приложения WSGI задействован, но в основном это: «Подождите, пока кто-то не посетит URL-адрес, а затем не сопоставьте URL-адрес с каким-то кодом, а затем выполните код». В вашем случае вы предоставили карту URL, которая ассоциировала «/» с MainPage. Когда кто-то посещает/URL-адрес, будет создан объект MainPage, и будет вызываться метод на нем.

В частности, поскольку метод HTTP, используемый для посещения/был GET, бегун приложения WSGI вызывает метод .get() на объекте MainPage. Операторы в методе get выполняются последовательно, записывая некоторые данные в ответ. Когда в теле функции больше нет выражений, он возвращается. Контейнер приложения WSGI отправляет этот ответ обратно в веб-браузер!

Эта программа никогда не заканчивается, потому что бегун приложений приложений WSGI навечно ждет следующего посещения URL. Но если это не так, как только последнее утверждение в вашем основном файле будет завершено, программа Python будет выполнена, и процесс завершится.

+0

Спасибо за внимание и отличный ответ, Нед. Он разъяснил мне несколько других аспектов. Но я все еще сомневаюсь в этом: «Как только кто-то посещает/URL-адрес, будет создан объект MainPage, и будет вызван его метод». Когда объект MainPage создается, он всегда будет выполнять процедуры внутри этого объекта (например, get, post и т. Д.)? – craftApprentice

+0

Единственный способ, которым приложение может найти код для запуска, - это поиск объекта для метода. Так что да, он всегда запускает метод на этом объекте. –

1

Код не выполняется линейно.

Сначала вы определяете класс, который будет готовить данные для страницы, когда вызывается определенный метод (get). Это определение класса MainPage.

Затем вы регистрируете этот класс в системе, а также сообщаете, когда использовать этот класс. Вы можете видеть, что это происходит в коде, который начинается с application = .... В коде говорится, что инфраструктура webapp использует MainPage, когда путь URL равен /. Как вы можете себе представить, здесь вы можете зарегистрировать несколько классов для разных маршрутов. Обратите внимание, что этот фрагмент кода выполняется один раз перед вызовом main.

Затем вы определяете точку входа программы: main(). Это простой: вы скажете, что среда начала работать с созданным вами application. Код под run_wsgi_app ждет запроса, проверяет путь URL-адреса по отношению к зарегистрированным классам, когда он его получает, получает ответ от зарегистрированного класса, вызывая его метод get() и отправляет ответ. Конечно, это грубое упрощение того, что на самом деле происходит там.

Наконец, вы вызываете main в последнем блоке кода.

Подводя итог: мы называем первым main, который вызывает run_wsgi_app, который инстанцирует MainPage и вызывает его метод get() с использованием структуры application.

+0

Спасибо, vhallac ваше объяснение просто и понятно. Но, я хотел бы знать: почему, когда main() вызывается и объект создается (MainPage is isantant), он выполняет метод get WHEN, нет ничего вызывающего get, а только определение get (def get (self)), , Я не понимаю, как происходит поток управления, потому что, если это был обычный скрипт функции, после определения процедуры я должен был бы назвать это. Не могли бы вы дать мне объяснение по этому поводу? – craftApprentice

+0

WSGI app runner вызывает .get(), потому что HTTP-метод GET использовался для посещения сайта. –

+0

Еще раз один раз, Нед. Я начинаю понимать, что происходит, хотя «потому что HTTP-метод GET использовался для посещения сайта» все еще звучит немного неясным для меня. Но знаю, что я думаю, что с большим количеством примеров я смогу понять (с другими примерами за пределами get(), например post()). Я думаю, что процедура get имеет оккультный вызов litte, но другие процедуры (например, post()) будут иметь более понятный вызов функции. Спасибо, что поделились своими знаниями и временем. – craftApprentice