首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >跨模块共享单例

跨模块共享单例
EN

Stack Overflow用户
提问于 2012-11-11 20:08:56
回答 3查看 4.6K关注 0票数 11

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

main:

代码语言:javascript
复制
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分别为:

代码语言:javascript
复制
import main

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

我现在预计执行main会在两个实例中产生相同的is和值20,但我得到的结果是:

代码语言:javascript
复制
$ python main.py
140592861777168
20
140592861207504
10

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-11-11 20:20:35

Python按名称加载每个模块一次(除非调用reload(module) )。如果运行main.py,则该模块为__main__ (尝试打印uvw.__class__.__module__)。当x导入main时,名为main的模块是第一次加载。

如果您在第三个模块中定义了uvw,或者在x中定义了它--只要它以相同的方式导入到__main__x中--它将是同一个对象。

票数 7
EN

Stack Overflow用户

发布于 2012-11-11 20:16:01

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

我认为这将会起作用:

singleton.py

代码语言:javascript
复制
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

代码语言:javascript
复制
from singleton import Singleton
uvw = Singleton()
print(id(uvw))
uvw.x += 10
print(uvw.x)

b.py

代码语言:javascript
复制
from singleton import Singleton
uvw = Singleton()
print(id(uvw))
uvw.x += 10
print(uvw.x)

main.py

代码语言:javascript
复制
import a
import b
票数 8
EN

Stack Overflow用户

发布于 2012-11-11 20:16:57

我发现问题在于,当从命令行执行main时,它被加载了两次,一次是作为__main__加载,第二次是作为main导入。

我发现了一个非常邪恶的方法来绕过第二个负载:

代码语言:javascript
复制
sys.modules["main"] = sys.modules["__main__"]

在我的例子中,分离主模块和单例类是不可取的。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13330974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档