2010-08-11 227 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