みんな、私はpythonクラスの制御フローを理解するのに苦労しています。つまり、コードが段階的に起こっていることです。以下の短いコードを考えると、私は知りたいです: クラス MainPage が呼び出されると、そのクラス内にあるすべてのものを実行するだけですか? 線形の順序で?(1 行目、2 行目以降など)
2 に答える
Python ファイルが実行されると、ファイル内のすべてのステートメントが上から下に実行されます。あなたの場合、6つのステートメントがあります:
from ..
from ..
class MainPage ..
application = ..
def main() ..
if __name__ ..
最初の 2 つは、他の Python モジュールを見つけて、それらのすべてのステートメントを実行します。これは、おそらく一連のクラスを定義するだけであり、次に、それらの他のモジュールの値を使用して、モジュール内にいくつかの名前を定義します。したがって、最初の 2 つのステートメントの後に、webapp
andがrun_wsgi_app
定義されています。
3 番目のステートメントは、クラスを定義しMainPage
ます。これは、クラス本体内のステートメントを実行することによって行われます。この場合は、 a def
. def
ステートメントを実行しても、関数本体のステートメントは実行されないことに注意してください。これらのステートメントを名前付き関数に収集するだけです。クラス本体が終了すると、定義されたすべての名前がクラスの属性になります。
4 番目のステートメントは を呼び出しwebapp.WSGIApplication
、結果を に代入しapplication
ます。
5 番目のステートメントは、 という関数を定義しますmain
。
6 番目のステートメントは name を調べます__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 アプリケーション コンテナーは、その応答を Web ブラウザーに送り返します。
WSGI アプリケーション ランナーは、次の URL へのアクセスを待機して永遠にループするため、このプログラムは決して終了しません。しかし、そうでない場合は、メイン ファイルの最後のステートメントが完了すると、Python プログラムが完了し、プロセスが終了します。
コードは直線的に実行されません。
get
最初に、特定のメソッド ( ) が呼び出されたときにページのデータを準備するクラスを定義します。のクラス定義ですMainPage
。
次に、このクラスをシステムに登録し、このクラスをいつ使用するかをシステムに伝えます。で始まるコードでそれが起こっていることがわかりますapplication = ...
。MainPage
そこにあるコードは、URL パスが の場合に使用するよう webapp フレームワークに指示します/
。ご想像のとおり、ここで異なるルートに複数のクラスを登録できます。このコードは、main
が呼び出される前に 1 回実行されることに注意してください。
次に、プログラムのエントリ ポイントを定義します: main()
. それは単純なものです:application
構築したもので実行を開始するようにフレームワークに指示します。以下のコードrun_wsgi_app
は、リクエストを待機し、リクエストを受信したときに登録済みのクラスに対して URL パスをチェックし、そのget()
メソッドを呼び出して登録済みのクラスからレスポンスを取得し、レスポンスを送信します。もちろん、これはそこで実際に起こっていることを極端に単純化しすぎています。
最後に、最後のコード ブロックで main を呼び出します。
要約すると、最初main
に を呼び出します。これは を呼び出します。これはrun_wsgi_app
をインスタンス化し、構造体を使用してMainPage
そのget()
メソッドを呼び出しますapplication
。