2016-03-30 17 views
0

以下は、例外処理とクラスを扱うpython documentationのコード例です。私はこれらの両方を理解するために取り組んでおり、背景はJavaであるため、クラスと変数を厳密に型指定することに慣れています。誰かがここで何が起こっているのか詳しく説明してください?Pythonの例外(ドキュメントの例)

class B: 
    pass 
class C(B): 
    pass 
class D(C): 
    pass 

for c in [B, C, D]: 
    try: 
     raise c() 
    except D: 
     print "D" 
    except C: 
     print "C" 
    except B: 
     print "B" 

は、第6行実際B、C、及びDのインスタンスを作成するか、または単にクラス型を作成しています。それらが単なるクラス型の場合、私はそれらがfor c in [B, C, D]:に置かれていると仮定します。クラスCとクラスDのインスタンスは、パラメータなしでどのようにインスタンス化できますか?それでは例外的なことは何ですか?

答えて

1

最初の6行はクラスを作成します。私は後で作成されるインスタンスの定義としてそれらを考えるのが好きです。 for c in [B, C, D]:を使用するとではないは何でもインスタンス化します。 BC、およびDのそれぞれにはまだちょうどクラスであるcが割り当てられます。最初の反復では、cBと同じです。したがって、raise c()と言うとき、c()Bのインスタンスを作成し、例外として発生させます。この例外はexcept B:ブロックで捕捉され、print "B"行が実行されます。次の反復の場合、c[B, C, D]Cの次の値に割り当てられます。今、raise c()Cのインスタンスを作成し、例外としてそれを発生させます。その例外はexcept C:ブロックに捕捉され、print "C"行が実行されます。 Dでも同じことが起こります。

1

最初の6行はクラスを定義します。それらはパラメータなしでインスタンス化される。 class C(B):は、クラスCBからを継承したことを意味し、Cのインスタンス化では引数を渡す必要はありません。これはdocumentation on classesで説明されています。

ループを通過するたびに、インタープリタは指定されたクラスのエラーを発生させます。それはBのためにBとどんなタイプの例外クラスが生成されたとしても印刷します。そのコードを実行すると表示される出力は、B、次にC、次にDです。これは、ループが反復された[B, C, D]のように、その順序で発生した例外のクラスであるためです。

0

最初の6行でクラスの種類が作成されています。

pythonのすべてを変数に割り当てることができるので、これには関数、クラス(そのクラスのインスタンス化されたオブジェクトだけでなく)が含まれます。for c in [B, C, D]:が実行しています。

最後に、try:の例外は、そのインスタンスを作成してc型の例外を発生させようとします。したがって、最初にタイプBの例外を発生させ、次にタイプCを入力してDを入力します。

exceptは、それぞれのタイプについて例外をキャッチします。 Python 2では、任意のオブジェクトを例外として呼び出すことができますが、これはPython 3と異なります。発生するすべての例外はBaseExceptionから派生する必要があります