5

伙计们,我在理解 python 类中的控制流方面遇到了一些麻烦,即一步一步地处理代码。鉴于下面的简短代码,我想知道:当调用 MainPage 类时,它只执行该类中的所有内容?以线性顺序?(第一行,第二行之后等)

在此处输入图像描述

4

2 回答 2

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 映射到一些代码,然后执行代码。” 在您的情况下,您提供了一个将“/”与MainPage. 一旦有人访问 / URL,MainPage就会创建一个对象,并调用其上的方法。

特别是,因为用于访问 / 的 HTTP 方法是 GET,WSGI 应用程序运行程序调用对象.get()上的方法MainPage。方法中的语句按get顺序执行,将一些数据写入响应。当函数体中没有更多语句时,它会返回。WSGI 应用程序容器将该响应发送回 Web 浏览器!

这个程序永远不会结束,因为 WSGI 应用程序运行器永远循环等待下一次 URL 访问。但如果没有,一旦主文件中的最后一条语句完成,Python 程序就会完成,并且该过程将结束。

于 2012-04-28T15:24:24.273 回答
1

代码不会线性执行。

首先,您定义一个类,该类将在调用某个方法 ( get) 时为页面准备数据。这是 的类定义MainPage

然后,你向系统注册这个类,同时告诉它什么时候使用这个类。您可以在以application = .... 那里的代码告诉 webapp 框架MainPage在 URL 路径为/. 可以想象,您可以在这里为不同的路线注册多个类。请注意,这段代码在main调用之前执行了一次。

然后,您定义程序入口点:main(). 这是一个简单的:你告诉框架开始运行application你构建的。下面的代码run_wsgi_app等待请求,在收到请求时检查注册类的 URL 路径,通过调用其get()方法从注册类获取响应,并发送响应。当然,这是对那里实际发生的事情的严重过度简化。

最后,在最后一个代码块中调用 main。

总结一下:我们首先调用main,调用run_wsgi_app,实例化 aMainPage并使用结构调用它的get()方法application

于 2012-04-28T15:25:54.087 回答