2010-08-11 111 views
1

我想要的是,我有foo.py它从bar1,bar2导入类,他们都需要bar3,例如,Python导入模块,所有导入另一个模块是相同的

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

有没有一种更有效的方法来让bar3可用于bar1和bar2文件,而无需直接导入它?

+0

一个例外,你是名正言顺地抓高炮约是'从富进口*'规则中指定的定义所有以某种“foo”特有的名称。例如,定义一个'exceptions'模块,并且每个异常都以Error结束。然后,您可以只从'例外导入*'执行操作,并让所有异常准备好'raise'或'except'。尽管如果你重新加载模块,那么以这种方式导入的类将__not__重新加载它。 – aaronasterling 2010-08-11 09:28:31

回答

5

这是完全有效的;当导入一个模块时,Python会将它添加到sys.modulesimport语句首先检查该字典(因为字典查找速度快,所以速度很快),以查看模块是否已经被导入。所以在这种情况下,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中定义的全局变量也会出现在你的名字空间中。这不好。

+0

谢谢,如果我从src导入*做一个,它是否只从__init__文件中取出全局变量?或者它会从src \中的其他模块的全局变量? – biokiwi 2010-08-11 09:42:23

+0

它记录在下面。如果你已经在'__init __。py'中定义了__all__,它将采用所有这些。如果你没有,它将只采用那些明确导入的。但是对于那些使用'import *'的人来说这是一个解决方法;你不应该那样做。 – katrielalex 2010-08-11 10:01:10