首页 > 解决方案 > 无法掌握:在 python 中制作一个简单的单例(对于 mongodb 管理器)

问题描述

我已经阅读了单身人士的各种主要例子,但我很难做出我想要的。我的主要灵感是这个例子:

class OnlyOne:
    class __OnlyOne:
        def __init__(self, arg):
            self.val = arg

        def __str__(self):
            return repr(self) + self.val
    instance = None
    def __init__(self, arg):
        if not OnlyOne.instance:
            OnlyOne.instance = OnlyOne.__OnlyOne(arg)
        else:
            OnlyOne.instance.val = arg
    def __getattr__(self, name):
        return getattr(self.instance, name)

但我不需要像 getattr 这样的东西,这是我的代码到目前为止:

class MongoManager:
    class __MongoManager:
        def __init__(self):
            # Initialise client
            self.client = pymongo.MongoClient('localhost', 27017)

    __instance = None

    def __init__(self):
        if not MongoManager.__instance:
            MongoManager.__instance = MongoManager.__MongoManager()

我想要的只是在我键入时获取变量客户端MongoManager.client,但我得到了错误AttributeError: 'MongoManager' object has no attribute 'client'。我想我可以尝试使用 getattr 并检查类似if arg == "client"但感觉很脏的东西,我相信有一种正确的方法可以做到这一点。

标签: pythonmongodbclasssingleton

解决方案


尝试这个:

class MongoManager:
     __instance = None
     @staticmethod 
     def getInstance():
         if MongoManager.__instance == None:
             MongoManager()
         return MongoManager.__instance
     def __init__(self):
        if MongoManager.__instance != None:
            raise Exception("This class is a singleton!")
        else:
            MongoManager.__instance = pymongo.MongoClient('localhost', 27017)

您可以通过调用来获取此类的实例MongoManager.getInstance()

我们在这里做什么?我们有一个类变量__instance,当创建类的对象时,我们正在初始化它。现在,当我们调用getInstance()这个存储在其中的实例时,__instance它将被传递而不是创建新实例。


推荐阅读