5

みんな、私はpythonクラスの制御フローを理解するのに苦労しています。つまり、コードが段階的に起こっていることです。以下の短いコードを考えると、私は知りたいです: クラス MainPage が呼び出されると、そのクラス内にあるすべてのものを実行するだけですか? 線形の順序で?(1 行目、2 行目以降など)

ここに画像の説明を入力

4

2 に答える 2

6

Python ファイルが実行されると、ファイル内のすべてのステートメントが上から下に実行されます。あなたの場合、6つのステートメントがあります:

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

最初の 2 つは、他の Python モジュールを見つけて、それらのすべてのステートメントを実行します。これは、おそらく一連のクラスを定義するだけであり、次に、それらの他のモジュールの値を使用して、モジュール内にいくつかの名前を定義します。したがって、最初の 2 つのステートメントの後に、webappandが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 プログラムが完了し、プロセスが終了します。

于 2012-04-28T15:24:24.273 に答える
1

コードは直線的に実行されません。

get最初に、特定のメソッド ( ) が呼び出されたときにページのデータを準備するクラスを定義します。のクラス定義ですMainPage

次に、このクラスをシステムに登録し、このクラスをいつ使用するかをシステムに伝えます。で始まるコードでそれが起こっていることがわかりますapplication = ...MainPageそこにあるコードは、URL パスが の場合に使用するよう webapp フレームワークに指示します/。ご想像のとおり、ここで異なるルートに複数のクラスを登録できます。このコードは、mainが呼び出される前に 1 回実行されることに注意してください。

次に、プログラムのエントリ ポイントを定義します: main(). それは単純なものです:application構築したもので実行を開始するようにフレームワークに指示します。以下のコードrun_wsgi_appは、リクエストを待機し、リクエストを受信したときに登録済みのクラスに対して URL パスをチェックし、そのget()メソッドを呼び出して登録済みのクラスからレスポンスを取得し、レスポンスを送信します。もちろん、これはそこで実際に起こっていることを極端に単純化しすぎています。

最後に、最後のコード ブロックで main を呼び出します。

要約すると、最初mainに を呼び出します。これは を呼び出します。これはrun_wsgi_appをインスタンス化し、構造体を使用してMainPageそのget()メソッドを呼び出しますapplication

于 2012-04-28T15:25:54.087 に答える