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ですか? 私はすでにファイルにロードloadsettingsしていallsms.pyます。

4

1 に答える 1

1

あなたはブロックで実行loadsettings()しています:if __name__ == "__main__"

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

このようなブロックの目的は、コードが直接実行された場合 ( などpython allsms.py) にのみ発生することです。つまり、次の行にインポートされたときに発生しません。

from SMShandler.allsms import SMSMgr

b.loadsettings()この行をブロックの外に置くと、if既にロードされていることがわかります。

于 2013-02-06T06:30:55.353 に答える