2011-09-13 25 views
29

Pythonには静的なコンストラクタがありますか?Pythonに静的コンストラクタまたは静的初期化子がありますか?

Pythonで静的コンストラクタを実装するにはどうすればよいですか?

これは私のコードです... __init__は、このようなアプリケーションを呼び出すと起動しません。 __init__は、静的なコンストラクタまたは静的な初期化子ではありません。私は、アプリケーションクラスを毎回インスタンス化され、このようにそれを呼び出す必要があり

App.EmailQueue.DoSomething() 

App().EmailQueue.DoSomething() 

ここでは、私のクラスである:

class App: 
    def __init__(self): 
     self._mailQueue = EmailQueue() 

    @property 
    def EmailQueue(self): 
     return self._mailQueue 

たびに__init__呼び出しに問題がされますAppオブジェクトが再作成されることを示します。私の「本当の」Appクラスはかなり長いです。

+5

?または、怠惰な初期化を求めていますか? – SLaks

答えて

15

ヒント:selfを参照するものは、クラスのインスタンス化が必要です。あなたは次のようにすることができます:

class App: 
    email_queue = EmailQueue() 

App.email_queue.DoSomething() 

しかし、それは綿毛のように思えます。私はSLaksで、クラスの外で初期化するだけです。また、singleton patternを調べることもできます。

18

静的言語と動的言語には基本的な違いがありますが、最初は必ずしも明らかではありません。

静的言語では、クラスはコンパイル時に定義されており、プログラムが実行される前にすべてが素敵であり、具体的に設定されています。

動的言語では、クラスは実際に実行時に定義されます。インタプリタがそれらのクラスとdef文のすべてを解析し実行するとすぐに、静的なコンストラクタに相当するものが実行されます。クラス定義はその時点で実行されています。

クラス本体の任意の場所に任意の数のステートメントを置くことができ、それらは静的なコンストラクタとして有効です。必要に応じて、selfをパラメータとしない関数にすべてを配置し、その関数をクラスの最後で呼び出すことができます。

+1

あなたは実際に '自分自身を取っておらず、クラスの終わりにその関数を呼び出す'関数にすべてを置いてみましたか?それは、その関数が実行されているときにクラスがまだ作成されていないため、聞こえるほど簡単ではありません。 –

2

あなたは、代わりにすることを使用して、あなたのアプリケーションのインスタンスを作成する必要がありますなぜあなたはちょうど右のクラスを定義した後、そのコードを入れていない

myApp = App() 
myApp.EmailQueue.DoSomething() 
+0

良い点。 OPは、「毎回」インスタンス化されるという事実を嘆いていました。 –

関連する問題