0

申し訳ありません初心者プログラマーは、クラスのインスタンスを一度に 1 つだけ実行することについて質問します。そして今、コードを構造化する正しい方法を見つけるのに苦労しています。

私は調査しましたが、適切なアプローチを見つけるのに苦労していますが、適切なpythonicアプローチに関する多くの議論は、モジュールまたはシングルトンであることです。たとえば、クラスのインスタンスが1つだけ実行されるようにする

3 つの変数 (2 つの温度と圧力センサー) を継続的にログに記録し、変数の傾向を調べるいくつかのロジックに基づいて、バルブを移動するコード (python 2.7.2) がいくつかあります (if ステートメントが true の場合、defs を呼び出します)実際には、すべての定義で同じデータセットを見て同じバルブを動かしたいので、多くのグローバルが散らばっているモジュール)。現時点では、これはすべてモジュール ファイルで正常に機能します。

ただし、ラボの他のユーザーが私のコードを実行できるようにするには、一般的な GUI から起動する必要があります。したがって、プロセスが GUI とコマンド ラインを結び付けないように、コードをスレッド化する必要があります。

私はコードをクラスに書き直し始め(スーパークラスのスレッド化を使用)、1 つ以上のスレッドが同じバルブを制御しようとしないように、クラスのインスタンスが 1 つだけ呼び出されたことにロジックを追加したいと考えました。 .

今、私はこれが Python ではそれほど簡単ではないことを発見し、「シングルトン」の概念が悪いことを読み、コードを構造化する方法の解決策を見つけるのに苦労しています。

これは答えられたに違いないと思うので、誰かが私を正しい方向に向けることができれば幸いです。

4

2 に答える 2

1

1 つのインスタンスを初期化し、初期化された定数のみにアクセスし、安全のために、誰かが別のインスタンスを作成しようとした場合に例外を発生させる必要があります

class Singletone(object):
    __initialized = False
    def __init__(self):
        if Singletone.__initialized:
            raise Exception("You can't create more than 1 instance of Singletone")
        Singletone.__initialized = True

MY_SINGLETONE_INSTANCE = Singletone()
于 2014-07-09T04:52:46.723 に答える
-1

http://norvig.com/python-iaq.htmlから:

def singleton(object, instantiated=[]):
    "Raise an exception if an object of this class has been instantiated before."
    assert object.__class__ not in instantiated, \
        "%s is a Singleton class but is already instantiated" % object.__class__
    instantiated.append(object.__class__)

class YourClass:
    "A singleton class to do something ..."
    def __init__(self, args):
        singleton(self)
        ...

ただし、マルチスレッド アプリケーションにどのように適応させる必要があるかはわかりません。

于 2012-12-10T18:48:24.433 に答える