2011-07-20 10 views
2

「初期設定」のステップは、実際に実行するために多くの時間がかかり、出力が巨大な可能性がありますので、私は、私はクラスが何度も何度も再作成としないことを本当に入力に基づいてシングルトンクラスを作成するにはどうすればよいですか?

class Conditional_Singleton(object): 
    def __init__(self, condition=None): 
     self.initialization = some_func_of(condition) 

として定義されたクラス希望しています同じ入力が与えられても、入力が変更された後は同じ入力を行います。何か案は?起こっていることは、あなたの条件に合うかどうかは

if 'condition' in myInstances: 
    # something down here that works with that instance 

:あなたはこのような何かをしたい、あなたのコードの他の部分では

myInstances = {} 

myInstances['condition'] = Conditional_Singleton('condition') 

+0

"条件"はどのように見えますか? –

+0

条件は実際にはシングルトンオブジェクトですが、実行時に何百万回も変更される別のクラスです。なぜ私はこのConditional_Singletonを条件付きにしたいのかという理由は、それぞれのシングルトン "contidion"が "Conditional_Singleton"を変更しないでおくほうが良いときに、その短い生涯の間に "Conditional_Singleton"に数回フィードされるからです。私はこの質問が以前に提起されたことを認識していますが、おそらくプールを設定することはここでの解決策ではありません。 – nye17

+2

なぜシングルトンが必要なのですか? – delnan

答えて

4
class Conditional_Singleton(object): 
    saved_insances = {} 
    def __new__(cls, condition = None): 
     if not condition in cls.saved_instances: 
      cls.saved_instances[condition] = super(
       Conditional_Singleton, cls).__new__(cls) 
     return cls.saved_instances[condition] 
    def __init__(self, condition = None): 
     if not getattr(self, 'initialization'): 
      self.initialization = some_func_of(condition) 

これにより、作成されたインスタンスのクラスが自動的に保存され、同じ条件が満たされた場合に自動的に再利用されます。

編集:あなたのコメントを見ました。このためにはconditionをハッシュする良い方法を見つける必要があります。したがって、それが__hash__を実装するクラスから派生しない限り、あなた自身でそれを実装する必要があります。

編集2:シングルトンに__init__の代わりに__new__を使用します。

+0

ありがとうございます。考えはハッシュ可能な入力になるように収束しました。あるいは高価な計算が入力クラスのプロパティになるようにコードを再構成する必要があると思います。 – nye17

+1

なぜ '__new__'ではなく' __init__'ですか?そして、 '__dict__'ではなく、実際のクラスインスタンスを保存することができます。 –

+0

うわー、私はちょうどコピー/貼り付けの代わりにそれを入力し、これを完全に忘れてしまった。私は編集します。念押し有難う。 – agf

1

あなたが潜在的にこのような何かを行うことができます辞書キーとして使用するためにハッシュ可能な条件を単純化できるかどうかによって異なります。

+0

入力いただきありがとうございます。これらの不都合を避けるためにコードの再構築が必要です。 – nye17

関連する問題