bgu*_*ach 11 python namespaces module globals
我正在重新组织我的代码,从而创建新的命名空间.我正在为模块更改"静态"类(每种方法中带有@staticmethod的类).这是要走的路,对吧?
问题是我对如何在这些模块之间共享资源有疑问.
假设我有一个模块,我从中与数据库建立了所有连接,当然所有类/方法都共享存储数据库游标的变量(我使用的是SQLite).现在,在不同的模块中,他们还必须共享光标.
所以,我的想法:
在每个模块中声明全局变量.但全球化是邪恶的,吃孩子并偷走我们的工作.所以我不知道这是不是要走的路.
'''Sub Module 1'''
global database_cursor
Run Code Online (Sandbox Code Playgroud)使用原始database_cursor导入"father"database_module并使用如下内容:
'''Sub Module 1'''
db_cursor = database_module.database_cursor
Run Code Online (Sandbox Code Playgroud)在这种情况下,第二个看起来很好,但我认为在许多情况下会导致递归导入,我想这是要避免的.
Ric*_*kyA 12
你的第二种方法是要走的路.Python导入本质上是单例.当多次导入模块时,它仅在第一次执行时执行.后续导入从全局变量中获取模块对象实例.更多关于这一点.
shared.py:
class Shared:
def __init__(self):
print("Init shared")
def do_stuff(self, from_mod):
print("Do stuff from {0}. I am instance {1}".format(from_mod, self))
shared = Shared()
Run Code Online (Sandbox Code Playgroud)
foo.py
import shared
shared.shared.do_stuff("foo")
Run Code Online (Sandbox Code Playgroud)
bar.py
import foo
import shared
shared.shared.do_stuff("bar")
Run Code Online (Sandbox Code Playgroud)
如果我们执行bar.py,我们会得到:
>>> Init shared
>>> Do stuff from foo. I am instance <shared.Shared instance at 0x10046df38>
>>> Do stuff from bar. I am instance <shared.Shared instance at 0x10046df38>
Run Code Online (Sandbox Code Playgroud)
因此,在您的情况下,您可以database_module
从任何您想要的地方进行引用,它只会初始化一次,因此可以有效地共享您的连接.
归档时间: |
|
查看次数: |
5317 次 |
最近记录: |