2012-04-28 10 views
3

pythonクラスの先頭に置かれた宣言が__init__の文と同じであるのだろうか?例えばpythonクラス内の宣言は_init_と同じですか?

import sys 

class bla(): 
    print 'not init' 
    def __init__(self): 
     print 'init' 
    def whatever(self): 
     print 'whatever' 

def main(): 
    b=bla() 
    b.whatever() 
    return 0 

if __name__ == '__main__': 
    sys.exit(main()) 

出力は、次のとおりです。追記として

not init 
init 
whatever 

、今の私はまた、取得:これがある理由について

Fatal Python error: PyImport_GetModuleDict: no module dictionary! 

This application has requested the Runtime to terminate it in an unusual way. 
Please contact the application's support team for more information. 

任意のアイデア?前もって感謝します!

+0

このエラーは、Pythonインストールが壊れていることを示しています。それは別の質問の話題です。どのバージョン、どのOS、どのように入手したのかなどの詳細を必ず含めてください。 – delnan

答えて

6

いいえ、それと同等ではありません。ステートメントprint 'not init'は、タイプblaのオブジェクトをインスタンス化する前であっても、クラスblaが定義されている間に実行されます。あなたはその後c=bla()をすれば、あなたのmain()がちょうどreturn 0それはまだnot initプリントに減らす場合にのみ、またinit

が印刷されますので、

>>> class bla(): 
... print 'not init' 
... def __init__(self): 
...  print 'init' 
not init 

>>> b = bla() 
init 
0

彼らは、まったく同じではありません。

0

このような宣言は、クラス全体のものです。 printがprintの代わりに変数代入だった場合、その変数はクラス変数になります。つまり、クラスの各オブジェクトではなく、クラス全体の変数のうちの1つだけが存在します。

0

これらは同等ではありません。 のinitメソッド以外のprintステートメントは、クラスが定義されているときに一度しか呼び出されません。私はあなたのmain()ルーチンを変更した場合たとえば、使用するには、以下:

def main(): 
    b=bla() 
    b.whatever() 
    c = bla() 
    c.whatever() 
    return 0 

私は、取得するには、次の出力:

not init 
init 
whatever 
init 
whatever 

のinitないprint文を一度実行し、クラスがあります定義されている。

+0

printステートメントは、クラスが定義されているときに一度だけ実行され、インスタンスが最初に作成されるときには実行されません。しかし、最後の文で正しく答えてください... – jadkik94

+0

ありがとうございます。私はそれを編集して、クラスが定義されていて、クラスのインスタンス化から独立しているときに、そのプリントが呼び出されるようにしました。 – CadentOrange

関連する問題