python - 无法掌握:在 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"
但感觉很脏的东西,我相信有一种正确的方法可以做到这一点。
解决方案
尝试这个:
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
它将被传递而不是创建新实例。
推荐阅读
- nginx - 使用 nginx 代理 S3 请求以进行授权
- reactjs - fetch api 或 whatwg-fetch 是否修改状态码为 304 到 200 的响应?
- python - 如何使用 pandas DataFrame 计算列表的字典?
- mysql - 在计算时间间隔时,有没有办法不改变 varchar 的类型?
- php - 从页面 A 在页面 B 上回显一个变量而不包含
- react-native - React native - 显示启动视频的最佳方式
- amazon-web-services - CircleCi 2.0:未找到 aws 命令
- javascript - 无法从角度路由器获取路径或 url
- java - 将字符串转换为日期格式后,月份显示不同
- angular - 如何从两个组件“选择”中选择数据?