Python导入模块相互引用的问题

5 投票
2 回答
16750 浏览
提问于 2025-04-16 02:37

我想要做的是,我有一个叫 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 里定义的所有全局变量都会出现在你的命名空间里,这样是不好的。

撰写回答