7

私はPythonプログラミングに不慣れです、私は1つのクラスを持っています、このクラスのために私は1つのオブジェクト(obj1)を作成しました。 (もう1つのオブジェクトを作成する代わりに)最初のオブジェクトのみにこれを行う方法は?以下のコードを参照してください?

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
4

3 に答える 3

8

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

ただし、1つのインスタンスのみを許可するコードを次に示します。

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

シングルトンが必要な場合は、Pythonとシングルトンパターンを見てください。シングルトンを定義するためのシンプルでエレガントな方法はありますか?

于 2012-04-29T09:03:30.643 に答える
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
于 2012-04-29T10:46:10.160 に答える
1

単一のオブジェクトを作成し、それをグローバル、つまり、コーディングするすべてが単一のファイルに含まれる場合はそれを使用してモジュールの最上位オブジェクトにするか、別のモジュールに入れてインポ​​ートすることができます。

于 2012-04-29T09:05:50.353 に答える