Python导入模块相互引用的问题
我想要做的是,我有一个叫 foo.py 的文件,它从 bar1 和 bar2 中导入了一些类,而这两个文件都需要用到 bar3,举个例子:
foo.py
from src import *
...
src/ __ init__.py
from bar1 import specialSandwichMaker
from bar2 import specialMuffinMaker
src/bar1.py
import bar3
class specialSandwichMaker(bar3.sandwichMaker)
...
src/bar2.py
import bar3
class specialMuffinMaker(bar3.muffinMaker)
...
有没有更有效的方法可以让 bar1 和 bar2 使用 bar3,而不需要它们直接去导入 bar3 呢?
2 个回答
1
你应该按照规定定义所有内容,具体可以参考这个链接:
http://docs.python.org/tutorial/modules.html#importing-from-a-package
8
这段话的意思是,当你在Python中导入一个模块时,Python会把它放到一个叫做 sys.modules
的地方。每次使用 import
语句时,Python会先检查这个地方(因为查找字典的速度很快)来看看这个模块是不是已经被导入过了。所以在这个例子中,bar1
会导入 bar3
并把它放到 sys.modules
里。接着,bar2
就可以使用已经导入的 bar3
了。
你可以用以下代码来验证这一点:
import sys
print( sys.modules )
另外,注意 from src import *
这种写法是不好的,尽量不要使用。你可以用 import src
然后用 src.specialSandwichMaker
来引用,或者直接用 from src import specialSandwichMaker
。这是因为模块之间不应该互相干扰,如果你用 from src import *
,那么 src
里定义的所有全局变量都会出现在你的命名空间里,这样是不好的。