How to initialize a python object once and share across other modules?
对于我的生活,我发现我的python转换非常令人沮丧。我正在尝试做的一件事是从配置字典初始化类的单个实例,然后在其他模块中访问该类。
我所面临的问题/我所采取的方法都没有解决,我希望有人能用正确的"Python"方法。
首先,我的应用程序可以作为扭曲插件的一部分进行初始化,或者作为独立脚本进行初始化。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | import resource class App(object): _config = None _someotherobject = None def __init__(self, config): self._config = config .... def main(): global myapp myapp = App({}) # Could use help here, how to pass config to it myapp = None #Global doesnt work as I expect, it doesnt modify this instance, stays as None if __name__ == '__main__': main() #-----------resource.py class Foo(object): def foo(self): app.myapp.somefunction() #NoneType object has no attribute |
在启动其他模块中的代码之前,我已经验证了是否创建了应用程序对象。我只是不明白模块中的"全局"实例为什么没有实际执行我所期望的操作,也不明白如何引用另一个模块中的实例。
-----编辑------为了澄清几个问题,脚本是用
只有当从另一个模块导入时,才会以独立脚本的形式调用您的
1 2 | if __name__ == '__main__': main() |
使模块可以从命令行运行的技巧。
证明它
1 2 | import app app.main() |
然后运行你的代码。
一旦您初始化了它,
我有一个类似的问题,我不想访问
我最后用的是博格而不是单胎。
要清除一点,下面是一个示例:
1 2 3 4 5 6 7 8 9 10 11 | class App: _config = None _someotherobject = None def __init__(self, config): self._config = config def main(): myapp = App(config) # pass a config object to App if __name__ =='__main__':main() |
在另一个应用程序中,您必须执行以下操作:
1 2 3 | from first_app import App myapp = App(config) |
你最大的问题就是索塔普提到的那个。如果您没有将
除此之外,"如何从另一个模块引用实例"非常简单,如果您知道一件简单的事情:
在python中,全局是有名称空间的。
更具体地说,在您的其他模块中,只有
正如sotapme所解释的那样,使用
尤其是在运行此命令时:
1 | python app.py |
python解释器将加载
现在,当
您还请求帮助将config传递给
1 | myapp = App({}) # Could use help here, how to pass config to it |
这样做:
1 | myapp = App(configdict) |
如果您的问题是知道如何获得
如果您试图解析一个用户可编辑的配置文件,那么对于传统的.ini样式的文件,
如果您试图从命令行构建配置信息,请参见
如果您想让环境变量与上述任何一个变量交互(例如,