我已经阅读了单例的各种主要示例,但我在制作我想要的东西时遇到了困难。我的主要灵感来自这个例子:
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"
的内容,但感觉很脏,我确信有一个正确的方法可以做到这一点。
试试这个:
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
中的实例将被传递,而不是创建新实例。
我成功地做到了我想做的事。我不完全理解
__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 时,我都会得到所需的客户端。
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