伙计们,我在理解 python 类中的控制流方面遇到了一些麻烦,即一步一步地处理代码。鉴于下面的简短代码,我想知道:当调用 MainPage 类时,它只执行该类中的所有内容?以线性顺序?(第一行,第二行之后等)
2 回答
当一个 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 程序就会完成,并且该过程将结束。
代码不会线性执行。
首先,您定义一个类,该类将在调用某个方法 ( get
) 时为页面准备数据。这是 的类定义MainPage
。
然后,你向系统注册这个类,同时告诉它什么时候使用这个类。您可以在以application = ...
. 那里的代码告诉 webapp 框架MainPage
在 URL 路径为/
. 可以想象,您可以在这里为不同的路线注册多个类。请注意,这段代码在main
调用之前执行了一次。
然后,您定义程序入口点:main()
. 这是一个简单的:你告诉框架开始运行application
你构建的。下面的代码run_wsgi_app
等待请求,在收到请求时检查注册类的 URL 路径,通过调用其get()
方法从注册类获取响应,并发送响应。当然,这是对那里实际发生的事情的严重过度简化。
最后,在最后一个代码块中调用 main。
总结一下:我们首先调用main
,调用run_wsgi_app
,实例化 aMainPage
并使用结构调用它的get()
方法application
。