python - 跨模块共享单例

标签 python python-3.x singleton

给定两个模块,main 和 x,内容如下:

主要内容:

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        cls._instance.x = 10
        return cls._instance
uvw = Singleton()

if __name__ == "__main__":
    print(id(uvw))
    uvw.x += 10
    print(uvw.x)
    import x

和x,分别是:

import main

print(id(main.uvw))
print(main.uvw.x)

我现在希望在两个实例中执行 main 会产生相同的 ID 和值 20,但我得到的是:

$ python main.py
140592861777168
20
140592861207504
10

有什么方法可以确保 uvw 在两个地方都是同一个对象?

最佳答案

我认为问题在于您的 Singleton 类以某种方式被重新加载,因此在第二个模块中丢失了它的 _instance 字段。


我认为这会起作用:

单例.py:

class Singleton(object):
    _instance = None
    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        cls._instance.x = 10
        return cls._instance

a.py:

from singleton import Singleton
uvw = Singleton()
print(id(uvw))
uvw.x += 10
print(uvw.x)

b.py:

from singleton import Singleton
uvw = Singleton()
print(id(uvw))
uvw.x += 10
print(uvw.x)

main.py

import a
import b

关于python - 跨模块共享单例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13330974/

相关文章:

multithreading - 静态类的析构函数需要互斥锁吗?

python - 使用嵌套 for 和 if 循环时加快 Python 速度

python - 不同模块中具有相同名称的类共享完全相同的名称字符串?

python - 如何从文件中读取字节

Python 单例日志记录无法正常工作 - 文件中存在重复的日志语句

c++ - 双重检查线程安全单例和无锁的创建

python - 连续过度松弛不收敛(当未就地完成时)

python - 对 NumPy 数组进行排序并同时排列另一个数组

python - 如何在 Ubuntu 18.04 中将 pip3 更新到最新版本?

python - 从 flask 中的 mysql 提取信息时出现问题