2012-04-29 7 views
4

私はこのクラスのために、私は1つのオブジェクト(obj1)を作成しました。このオブジェクト以外のオブジェクトを作成したくない場合、このクラスのオブジェクトをもう1つ作成したい場合は、最初のオブジェクトのみを参照する必要があります(もう1つのオブジェクトを作成するのではなく)。これを行うには?下記のコードを参考にしてください。Pythonでオブジェクトを作成しないようにする方法は?

class MyClass: 
    def __init__(self): 
     pass 
obj1=MyClass()//create object 
obj2=MyClass()//avoid creation and refer obj2 to obj1 
obj3=MyClass()//avoid creation and refer obj3 to obj1 
+1

チェックこの回答http://stackoverflow.com/questions/6760685/creating-a-singleton Pythonのシングルトンの-in-python –

+0

の可能な複製[Pythonでシングルトンを定義する簡単で洗練された方法はありますか?](http://stackoverflow.com/questions/31875/is-there-a-simple-elegant- way-to-define-singleton-in-python) –

+2

トピックを削除しますが、Pythonコメントでは、hasで始まりますh文字(#)。 – martineau

答えて

7

だから、シングルトンっぽい何かをしたいですか?次に、これにオブジェクトを使用しないでください。関数を別のモジュール(.pyファイル)に置き、モジュールスコープ(例:グローバル変数)に変数を入れるだけです。スレッド安全性を必要としない場合は、必要な処理を実行するためのpyononicな方法です。覚えておいてください:それはJavaではなく、すべてのクラスを使用することは行く方法ではありません。

しかし、ここで一つだけのインスタンスを可能にするいくつかのコードがあります:

class MyClass: 
    def __init__(self): 
     if getattr(self.__class__, '_has_instance', False): 
      raise RuntimeError('Cannot create another instance') 
     self.__class__._has_instance = True 

あなたがシングルトンをしたい場合は、Python and the Singleton PatternIs there a simple, elegant way to define singletons?

+4

他の問題についても議論していますが、[Python Is Not Java](http://dirtsimple.org/2004/12/python-is -not-java.html)。 – delnan

+1

@delnanすごかったです。良いコメント –

+0

私の+1は、クラスの代わりにモジュールを使用しています。クラスとインスタンスは実際には、モジュールと比較してより多くのインスタンスを作成できるように作成されました。 – pepr

1

で見ているあなたは、単一のオブジェクトを作成し、そのグローバルすなわち作ることができますコーディング中のすべてが単一のファイルに入っている場合や、別のモジュールに入れてインポ​​ートする場合は、モジュール内の最上位のオブジェクトを使用してください。

+0

これは解決策ではありません。シングルトンパターンは、(プログラムの他の部分を意識しない)コードが別の*シングルトンオブジェクトを作成した場合、実際には他の特別な手段なしで唯一のものを共有することを意味します。単一のオブジェクトを共有するという合意は、他のコードが別のインスタンスを作成することを妨げるものではありません。 – pepr

3

は、ここで簡単な方法です - クラス名隠す: - コメントで指摘したように、しかし、不可能ではない

class obj: 
    pass 

obj = obj() 

class objインスタンスは、より後で作成することは困難になります。

別の代替、その最初の使用後にクラスを削除します。

class MyClass: 
    def method(self): print 'spam' 

obj1 = MyClass() 
del MyClass 
obj1.method() # show instance still exists 
obj2 = MyClass() 

出力:

spam 
Traceback (most recent call last): 
    File "noclass.py", line 7, in <module> 
    obj2 = MyClass() 
NameError: name 'MyClass' is not defined 
+3

'obj2 = type(obj)()'。実際には、そのようなコードは、メタプログラミングコードの中で、良い理由のために(そして悪意をもたずに)時折使用されます。 – delnan

+0

そうですね、私はORMコードとPythonと他の言語のインターフェイスでこのような狂気のようなものを見てきました。 –

関連する問題