模块之间共享资源的良好实践?

时间:2012-11-30 09:50:02

标签: python module namespaces globals

我正在重新组织我的代码,从而创建新的命名空间。我正在为模块更改“静态”类(每种方法中带有@staticmethod的类)。这是要走的路,对吧?

问题在于我对如何在这些模块之间共享资源表示怀疑。

假设我有一个模块,我从中与数据库建立了所有连接,当然所有类/方法都共享存储数据库游标的变量(我使用的是SQLite)。现在,在不同的模块中,他们还必须共享光标。

Graphical representation of dependences

所以,我的想法:

  • 在每个模块中声明全局变量。但全球化是邪恶的,吃孩子并偷走我们的工作。所以我不知道这是否可行。

    '''Sub Module 1'''
    
    global database_cursor
    
  • 使用原始的database_cursor导入“father”database_module并使用以下内容:

    '''Sub Module 1'''
    
    db_cursor = database_module.database_cursor
    

在这种情况下,第二个看起来很好,但我认为在很多情况下会导致递归导入,我想这是应该避免的。

1 个答案:

答案 0 :(得分:11)

你的第二种方法是要走的路。 Python导入本质上是单例。当多次导入模块时,它仅在第一次执行时执行。后续导入从全局变量中获取模块对象实例。更多关于here

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()

foo.py

import shared

shared.shared.do_stuff("foo")

bar.py

import foo
import shared

shared.shared.do_stuff("bar")

如果我们执行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>

因此,在您的情况下,您可以从任何地方引用database_module,并且只会初始化一次,因此可以有效地共享您的连接。