2011-10-25 11 views
1

私はこの(例)コードを持っています。この問題に対する素晴らしいPythonesqueソリューションは何ですか?私の特定の状況init()遅延静的クラスメンバ初期


サードパーティおよび適応することができないとAとは異なるファイルに呼ばれているが定義されています。

+0

「A」が初期化されるまで初期化を遅らせる必要がある場合、 'foo'は実際には静的ではなくシングルトンです。 –

+2

fooがクラス属性であることが本当に必要ですか?私はあなたがデザインのその部分を再加工する方がよいと思っています。 –

+0

問題のクラスは 'Character'であり、静的属性は' Character.sprite'です。これは、すべての 'Character'インスタンスに共通するものであり、密接に関係しているので、静的メンバーの属性が最もよく見えました。私が使用するライブラリは、ライブラリが初期化される前にファイルからスプライトを読み込むことができません。 – orlp

答えて

0

このようにしますか?

class A: 
    foo = None 
    def __init__(self): 
     if A.foo is None: 
      A.foo = bar() 
     print(A.foo) 

あなたはA.__init__()(例えば、明示的にそのコンストラクタを呼び出す前Aオブジェクトをunpickle化するとき)に呼び出されるかわからない場合にもA.__new__()if文を移動することができます。

+0

これは私が考えていた解決策ですが、より良い、よりPythonesqueな方法が必要であると思いました。 – orlp

+0

私が理解する限り、それは例外を得ることからあなたを救うだけです。 'foo'は' init() 'が呼び出されるまでしばらくの間、' None'値を持つことができます。静的変数をインスタンスの初期化にバインドすることもお勧めします。 'foo = bar()'を設定する明示的な静的初期化関数を追加する方が良い方法だと思います。 – Xyand

0

bar()への呼び出しを別の関数にラップすると、init()が確実に呼び出されます。

+0

それは 'init()'が呼び出されたことをどのように保証しますか? – orlp

+0

それはあなたがそれを捕まえることができる例外をスローする場合は、 '仕事を拒否'によってあなたが意味するものによって異なります。 'None'を返すと、それをチェックすることができます。詳細はこちら。望ましい行動は何ですか? – Xyand

+0

例外をスローします。しかし、あなたはそれで何ができますか? – orlp

関連する問題