我目前正在用Python编写一个内部抽象层,以帮助我们的开发人员与我们的内部数据存储进行对话,而不向他们透露细节。
抽象层的某些部分需要各种连接和配置(如路径、数据库连接等)。既然我们希望保持尽可能的灵活性,我们决定把细节抽象出来。为此,我创建了一个Configuration类,它有许多未实现的方法来获取内部所需的详细信息:
class Configuration:
def get_mongo_client(self):
"""
:returns: a :py:class:`pymongo.MongoClient` instance that should be used \
for talking to the database
"""
raise NotImplementedError()
# more getters...现在,假设我有一个需要内部Users实例的Configuration类。什么是最好的方式使它可用?我真的很想*避免让Configuration成为__init__的一个参数。还有其他的方法来传递它吗?有什么当地的加工商店我可以用吗?
发布于 2014-01-13 13:58:16
你们有几个选择。最好的方法可能是将配置实例作为参数传递给init。正如丹尼尔·罗斯曼( Daniel )在上文所指出的,“明示胜于含蓄”。或者,您可以设置一个全局变量,该变量包含配置的一个实例,并可以在需要时进行访问。但显然,应该避免使用全局变量。最后,您可以使用单例模式,尽管这在许多方面比全局变量好得多。这里对单身人士的描述如下:
模式
但基本上,它允许您在任何需要使用配置对象信息的地方创建配置对象的新实例,但由于其创建方式,您将获得对具有相同内部数据的同一个配置实例的引用。
所以,就像:
def SingletonConfiguration():
# implementation
config = SingletonConfiguration()
config.Setup()
# Do any configuration ended of instance
class UseConfig():
def __init__():
a = SingletonConfiguration() # will return same config instance as was
# previously setup
a.getconfig()有关python中的单例的更多信息可以在这里看到:
如果您不想将配置实例传递给init,那么单例可能是最好的方法。不过,要记住,它与全局变量有类似的问题。虽然它在全局命名空间中不可见,但对任何单例实例的任何修改都将修改其值,无论它在何处使用。因此,应用程序的完全不同的部分现在被捆绑在一起,并且可以以一种很难看到和调试的方式以可能不好的方式进行交互。如果需要在程序的两个部分之间建立关系,那么最好像传递给init的合作伙伴那样显式地添加它,然后让它具有更隐蔽的接口,就像这样。
发布于 2014-01-13 14:49:12
您可以尝试使用whs.commons.abc。它提供会话抽象。您可以创建自己的会话类,在其中可以实现at_begin和at_end挂钩,然后可以通过装饰Session.use (从whs.commons.abc.session导入Session )注册它。现在,在应用程序开始时,使用Session().begin()和您需要的任何参数(它们将在程序结束时传递给at_begin kwargs)和Session().end()。Session对象已经是Singleton,所以您可以使用它来存储配置数据(可能是单个Config对象?)。
不幸的是,这个包没有在线文档,但是您可以打开它的源代码,检查哪些模块存在,哪些模块在这些模块中(我认为docstring很好)。
https://stackoverflow.com/questions/21092780
复制相似问题