无法掌握:用Python制作一个简单的单例(对于mongodb管理器)

问题描述 投票:0回答:3

我已经阅读了单例的各种主要示例,但我在制作我想要的东西时遇到了困难。我的主要灵感来自这个例子:

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 时获取变量

client
,但我收到错误
AttributeError: 'MongoManager' object has no attribute 'client'
。 我想我可以尝试使用 getattr 并检查类似
if arg == "client"
的内容,但感觉很脏,我确信有一个正确的方法可以做到这一点。

python mongodb class singleton
3个回答
5
投票

试试这个:

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
中的实例将被传递,而不是创建新实例。


1
投票

我成功地做到了我想做的事。我不完全理解

__getattr__
是如何工作的,所以需要多读一点。

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

    __instance = None

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

    def __getattr__(self, item):
        return getattr(self.__instance, item)

现在每当我调用 MongoManager().client 时,我都会得到所需的客户端。


0
投票
from pymongo import MongoClient

class MongoDB():
    _instance = None
    _connection = None

    def __new__(cls, *args, **kwargs):
        if cls._instance is None:
            cls._instance = super(MongoDB, cls).__new__(cls, *args, **kwargs)
        return cls._instance

    def get_connection(self):
        if self._connection is None:
            self._connection = MongoClient("mongodb://localhost:27017/")
        return self._connection

# Usage example
if __name__ == "__main__":
    db1 = MongoDB()
    db2 = MongoDB()

    print(db1.get_connection())  # Should print the same connection object
    print(db2.get_connection())  # Should print the same connection object
    print(db1 is db2)            # Should print True
© www.soinside.com 2019 - 2024. All rights reserved.