1

似たような質問が何度かありますが、理解に苦しみます。Singleton または Borg パターンを使用して、オブジェクトのインスタンスを 1 つだけ作成したり、その状態を共有したりできると考えていました。期待どおりに動作しない (動作する) テスト例があります。コードが間違っているか、シングルトン/ボーグ パターンの概念を誤解しています。

シングルトンボーグパターンを使用して、ファイルに次のコードを作成しましたborg.py

class Singleton(object):
  _instance = None
  def __new__(class_, *args, **kwargs):
    if not isinstance(class_._instance, class_):
        class_._instance = object.__new__(class_, *args, **kwargs)
    return class_._instance



class MySingleton(Singleton):

    def __init__(self):
        self._list = []

    def add(self,x):
        self._list.append(x)

    def get(self):
        return self._list

class MyBorg(object):
    __shared_state = {}
    def __init__(self):
        self.__dict__ = self.__shared_state
        # and whatever else you want in your class -- that's all!
        self._list = []

    def add(self,x):
        self._list.append(x)

    def get(self):
        return self._list

次にファイルmodule.py

from borg import MyBorg
myborg = MyBorg()
myborg.add(42)
print "just added something"

そして最後にメインコード:

from borg import MyBorg
import module
myborg = MyBorg()
myborg.add(4711)
print myborg.get()

ボーグの代わりにシングルトンを使用するには、後者の 2 つのクラスを にMyBorg置き換える必要があります。MySingleton

modules.pyここでメイン コードを実行すると、それが最初に呼び出され、リストに値が追加されていることがはっきりとわかります。その後、Singleton/Borg パターンもメイン コードでインスタンス化され、(別の) 値が追加されます。リストには 2 つの値 (42 と 4711) があると予想していましたが、リストには後者の値しかありません。

のインスタンスmodule.pyが範囲外になり、 で行われたことmodule.pyはすべて削除された可能性があります。しかし、私が必要としているのは、どこで使用しても同じコンテンツを含むオブジェクトを持つことでした。

どうすればこれを達成できますか?オブジェクト MyBorg (または何でも) のインスタンスを作成するときに、リストに追加されたように値「42」が含まれていることを確認するにはどうすればよいmodule.pyですか? これを達成するには、どのパターン/メカニズムを使用する必要がありますか?

4

1 に答える 1