0

我创建了一个单例这是类描述。
allsms.py

from DB.models import ApiKey,ServiceProvider
from DB.messagenet import MessageNet


class SMSMgr( object ):
    _instance = None
    _allsp = []
    def __init__(self):
            pass
    def __new__(cls, *args, **kwargs):
        if not cls._instance :
            cls._instance = super(SMSMgr, cls).__new__(
                                cls, *args, **kwargs)
        return cls._instance

    def loadsettings(self):
        get_all_sp = ServiceProvider.objects.filter(status = False)
        for obj in get_all_sp:
            cla = obj.class_Name
            a=globals()[str(obj.class_Name)](obj.userName,obj.password,obj.sendingurl)
            self._allsp.append(a)
            #print self._allsp
    def reload(self):
        self._allsp = []
        get_all_sp = ServiceProvider.objects.filter(status = False)
        for obj in get_all_sp:
            cla = obj.class_Name
            a=globals()[str(obj.class_Name)](obj.userName,obj.password,obj.sendingurl)
            self._allsp.append(a)


    def send(self):
        print "+++++++++++++++++++== Global send "

if __name__ == "__main__":

    b = SMSMgr()
    b.loadsettings()

现在在test.py 同一目录的文件中,我尝试使用存储在_allsp 变量中的单例对象。

from SMShandler.allsms import SMSMgr

b = SMSMgr()
#b.loadsettings()

print b._allsp

这是打印空列表。但是当我这样做时:

b = SMSMgr()
b.loadsettings()
print b._allsp

它正在打印对象列表。

我的问题是,如果上面的设计是单例的,那么为什么print b._allsp要打印空列表test.py呢?我已经loadsettingsallsms.py文件中加载了。

4

1 回答 1

1

您正在loadsettings()一个if __name__ == "__main__"块中运行:

if __name__ == "__main__":
    b = SMSMgr()
    b.loadsettings()

这种块的目的是仅在代码直接运行时发生(如python allsms.py)。这意味着当它在行中导入时不会发生:

from SMShandler.allsms import SMSMgr

If you put the line b.loadsettings() outside of the if block, you'll see that it will already be loaded.

于 2013-02-06T06:30:55.353 回答