给定两个模块,main和x,内容如下:
main:
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会在两个实例中产生相同的is和值20,但我得到的结果是:
$ python main.py
140592861777168
20
140592861207504
10有没有什么方法可以确保uvw在两个地方都是同一个对象?
发布于 2012-11-11 20:20:35
Python按名称加载每个模块一次(除非调用reload(module) )。如果运行main.py,则该模块为__main__ (尝试打印uvw.__class__.__module__)。当x导入main时,名为main的模块是第一次加载。
如果您在第三个模块中定义了uvw,或者在x中定义了它--只要它以相同的方式导入到__main__和x中--它将是同一个对象。
发布于 2012-11-11 20:16:01
我认为问题在于您的Singleton类正在以某种方式被重新加载,因此在第二个模块中丢失了它的_instance字段。
我认为这将会起作用:
singleton.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._instancea.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发布于 2012-11-11 20:16:57
我发现问题在于,当从命令行执行main时,它被加载了两次,一次是作为__main__加载,第二次是作为main导入。
我发现了一个非常邪恶的方法来绕过第二个负载:
sys.modules["main"] = sys.modules["__main__"]在我的例子中,分离主模块和单例类是不可取的。
https://stackoverflow.com/questions/13330974
复制相似问题