Ребята, у меня возникли проблемы с пониманием потока управления в классе python, т. Е. Что происходит с кодом шаг за шагом. Учитывая короткий код ниже, я хотел бы знать: когда класс MainPage называется, он просто выполняет все, что находится внутри этого класса? В линейном порядке? (Первая строка, после второго и т.д.)Неисправность в понимании потока управления в классе python (в движке Google)
ответ
Когда файл 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 будет выполнена, и процесс завершится.
Спасибо за внимание и отличный ответ, Нед. Он разъяснил мне несколько других аспектов. Но я все еще сомневаюсь в этом: «Как только кто-то посещает/URL-адрес, будет создан объект MainPage, и будет вызван его метод». Когда объект MainPage создается, он всегда будет выполнять процедуры внутри этого объекта (например, get, post и т. Д.)? – craftApprentice
Единственный способ, которым приложение может найти код для запуска, - это поиск объекта для метода. Так что да, он всегда запускает метод на этом объекте. –
Код не выполняется линейно.
Сначала вы определяете класс, который будет готовить данные для страницы, когда вызывается определенный метод (get
). Это определение класса MainPage
.
Затем вы регистрируете этот класс в системе, а также сообщаете, когда использовать этот класс. Вы можете видеть, что это происходит в коде, который начинается с application = ...
. В коде говорится, что инфраструктура webapp использует MainPage
, когда путь URL равен /
. Как вы можете себе представить, здесь вы можете зарегистрировать несколько классов для разных маршрутов. Обратите внимание, что этот фрагмент кода выполняется один раз перед вызовом main
.
Затем вы определяете точку входа программы: main()
. Это простой: вы скажете, что среда начала работать с созданным вами application
. Код под run_wsgi_app
ждет запроса, проверяет путь URL-адреса по отношению к зарегистрированным классам, когда он его получает, получает ответ от зарегистрированного класса, вызывая его метод get()
и отправляет ответ. Конечно, это грубое упрощение того, что на самом деле происходит там.
Наконец, вы вызываете main в последнем блоке кода.
Подводя итог: мы называем первым main
, который вызывает run_wsgi_app
, который инстанцирует MainPage
и вызывает его метод get()
с использованием структуры application
.
Спасибо, vhallac ваше объяснение просто и понятно. Но, я хотел бы знать: почему, когда main() вызывается и объект создается (MainPage is isantant), он выполняет метод get WHEN, нет ничего вызывающего get, а только определение get (def get (self)), , Я не понимаю, как происходит поток управления, потому что, если это был обычный скрипт функции, после определения процедуры я должен был бы назвать это. Не могли бы вы дать мне объяснение по этому поводу? – craftApprentice
WSGI app runner вызывает .get(), потому что HTTP-метод GET использовался для посещения сайта. –
Еще раз один раз, Нед. Я начинаю понимать, что происходит, хотя «потому что HTTP-метод GET использовался для посещения сайта» все еще звучит немного неясным для меня. Но знаю, что я думаю, что с большим количеством примеров я смогу понять (с другими примерами за пределами get(), например post()). Я думаю, что процедура get имеет оккультный вызов litte, но другие процедуры (например, post()) будут иметь более понятный вызов функции. Спасибо, что поделились своими знаниями и временем. – craftApprentice
http://webpy.org/docs/0.3/tutorial – dm03514