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

时间:2011-10-17 17:39:21

标签: python module import

我有一个包含许多模块和类的大型python代码。我有一个特殊的类,它的整个代码中需要单个实例(它是一个线程应用程序,并且该类的实例也包含线程本地存储,锁等)。总是在每个导入的模块中“填充”该实例有点不舒服。我知道,使用全局变量并不是最好的做法,但无论如何:在python中是否有任何“导入钩子”,所以我可以挂钩来让我的实例在每个模块中都可用而无需额外的工作?它应该适用于正常导入,“来自mod import ...”,也适用于 import 结构。如果无法做到这一点,您能否提出更好的解决方案? Certenly将这个实例传递给每个类的构造函数等都没有多大的乐趣...继承也没有用,因为我有没有类的模块,而且我需要一个实例,而不是类本身......

class master():
    def import_module(self, name):
        mod = __import__(name)
        mod.m = self
        return mod
[...]
m = master()

目前我正在考虑这样的事情:但是我必须使用m.import_module()来导入模块,然后其他模块将拥有名为“m”的主类实例,所以我可以使用m.import_module ()也等等。但是我必须放弃使用“普通”导入语句,我应该写这个:

example_mod = m.module_import("example_mod")

而不仅仅是这个:

import example_mod

(但我肯定也可以这样做,然后将“m”分配给example_mod.m)

2 个答案:

答案 0 :(得分:4)

  

当然,将该实例传递给构造函数并不好玩   每个班级

您不必这样做。在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

答案 1 :(得分:2)

让每个模块导入所需对象有什么问题?明确比隐含更好。