如何在Python中为每个导入的文件自动设置全局?

如何在Python中为每个导入的文件自动设置全局?,python,module,import,Python,Module,Import,我有一个包含许多模块和类的大型python代码。我有一个特殊的类,它的单个实例在代码中的任何地方都是必需的(它是一个线程化的应用程序,并且该类的实例还包含线程本地存储、锁等)。总是在每个导入的模块中“填充”该实例有点不舒服。我知道,使用globals不是最佳实践,但无论如何:python中是否有任何“import hook”,因此我可以在它上进行钩住,使我的实例在每个模块中都可用,而无需额外工作?它也适用于正常导入,“从mod import…”,也适用于导入构造。如果这是不可能的,你能建议一个更

我有一个包含许多模块和类的大型python代码。我有一个特殊的类,它的单个实例在代码中的任何地方都是必需的(它是一个线程化的应用程序,并且该类的实例还包含线程本地存储、锁等)。总是在每个导入的模块中“填充”该实例有点不舒服。我知道,使用globals不是最佳实践,但无论如何:python中是否有任何“import hook”,因此我可以在它上进行钩住,使我的实例在每个模块中都可用,而无需额外工作?它也适用于正常导入,“从mod import…”,也适用于导入构造。如果这是不可能的,你能建议一个更好的解决方案吗?当然,将该实例传递给每个类的构造函数并不有趣,等等。。。继承也没有帮助,因为我有没有类的模块,而且我需要一个实例,而不是类本身

class master():
    def import_module(self, name):
        mod = __import__(name)
        mod.m = self
        return mod
[...]
m = master()
目前我的想法是这样的:但是我必须使用m.import_module()来导入模块,然后其他模块将有名为“m”的master类实例可用,所以我也可以使用m.import_module()等等。但是我必须放弃使用“普通”导入语句,我应该写以下内容:

example_mod = m.module_import("example_mod")
而不仅仅是这样:

import example_mod

(当然我也可以这样做,将“m”指定给示例_mod.m)

让每个模块导入所需的对象有什么不对?显式比隐式好

当然,将该实例传递给 每班

你不必这么做。在模块中设置全局类,如
config
并导入它

# /myapp/enviroment/__init__.py

class ThatSingleInstanceClass: pass

# create the singleton object directly or have a function init the module
singleton = ThatSingleInstanceClass() 



# /myapp/somewhere.py

# all you need to use the object is importing it
from myapp.enviroment import singleton

class SomeClass:

    def __init__(self): # no need to pass that object
        print "Always the same object:", singleton

好吧,这也很难看,因为那个实例被大量使用,所以我想把它放到导入的mod的全局名称空间中,所以我不需要每次都写“self”:如果我将我的“master”类的实例传递给导入模块中的类的构造函数,那么这个难看的hack需要说“global m”,然后说“m=m_in”其中m_in是构造函数的参数。另一个解决方案是将其放入类的命名空间中,但我必须在其他方法中使用它作为“self.something”。由于python也有一些类似sorted()的全局变量,所以我希望我的“m”作为全局变量随处可见。请参阅@Jochen Ritzel的答案。我就是这个意思。好吧,对不起,我完全误解了。我同意,只是-看起来-我在理解python导入细节时遇到了一些问题:)非常感谢!看起来我还需要学习很多,在这之前我会猜到导入Instance会导致不同的实例,但我现在很清楚,如果导入一个模块,就会使用名称空间,即使它是从另一个模块导入的,所以它也不会是新的。我只是好奇如果我有我的类名master,它是否足够脏,然后我用名称master创建一个实例[so,相同的名称]:)这样,在那之后,没有其他模块可以错误地导入类本身,只有实例:)它对我有效。@LGB:如果你遵循pep8(你应该),你会给你的类命名
master
(类在python中使用PascalCase),然后与
master
实例没有冲突——只是说您应该选择一个更有意义的变量名?人们如何使用变量?命名它。