单例类有不同的分配地址

问题描述 投票:0回答:1

在 a.py 类中,它正在获取指标字典的值。我试图将这些值保存到 container.py 中的全局字典变量中,然后在 b.py 中访问它们。

因此,我在container.py中声明了一个名为GlobalContainer的单例,并在其中声明了一个字典。然后,在 a.py 中,我将获取的值添加到该字典中。但是,当我尝试从 b.py 访问单例中的字典时,没有值。经查,发现container.py中GlobalContainer的内存地址不一样。

我需要一个可从 a.py、b.py、c.py 等访问的单个数据存储。我不明白为什么单例地址不同。

容器.py

class Singleton:
  def __init__(self, decorated):
    self._decorated = decorated
    self._initialized = False  # Flag for first instance creation

  def instance(self):
    if not self._initialized:
      self._instance = self._decorated()
      self._initialized = True
    return self._instance

  def __call__(self):
    raise TypeError('Singletons must be accessed through `instance()`.')

  def __instancecheck__(self, inst):
    return isinstance(inst, self._decorated)

  def __wrap__(self, instance, objtype, wrapper):
    # Allow access to class methods using the actual class object (cls)
    instance.__getattribute__ = lambda self, name: getattr(objtype, name, self.__dict__[name])
    return wrapper(instance)

@Singleton
class GlobalContainer:
    containers = {}

    def __init__(self):
    # No initialization check needed here
        print("### GlobalContainer created")  # This will print only once

    @classmethod
    def set_indicators(cls, symbol, indicators):
        if symbol not in cls.containers:
            cls.containers[symbol] = {'indicators': indicators}
        else:
            cls.containers[symbol]['indicators'] = indicators

    @classmethod
    def get_indicators(cls, symbol):
        container = cls.containers.get(symbol, {})
        return container.get('indicators', None)

在a.py中

GlobalContainer.instance().set_indicators(self.symbol, self.indicators)

在b.py中

GlobalContainer.instance().get_indicators(symbol)

单例init部分中的print('### GlobalContainer created')被执行了两次。我只想创建一个实例并将其用作 GlobalContainer 的全局变量。

python singleton
1个回答
0
投票

“单例”有两个不同的地址,因为您正在执行两个不同的脚本,每个脚本在启动时定义一个新的

GlobalContainers
类。该类在两个单独的进程之间共享。

© www.soinside.com 2019 - 2024. All rights reserved.