2012-07-15 121 views
3

所以我有兩個模塊A和B,另一個安裝模塊C.說我在A和B中使用C的一些方法。我還需要B中的模塊A.因此,從邏輯上來說,我的進口是:分層蟒蛇進口

答:

import C 

B:

import A 

邏輯會告訴我,B將包含從A和C.然而,這並不工作職能這種方式默認。在此指的是任何功能下,在模塊A的意義上,我們需要的命名空間引用額外水平

A.C.some_c_module() 

我發現,我們可以同時在一個導入C和B在不使用的討厭的「C像「ifdef克隆」這樣的語言,它會正常工作。我的問題是,兩次輸入這樣的模塊是否會受到懲罰?從某種意義上來說,python足夠聰明地知道A.C.some_module == C.some_module?還是我這樣做只是一個壞男孩?

回答

3

導入模塊兩次不會導致它被加載兩次。 Python加載模塊一次並保存對它的引用。所以是的,Python很聰明,知道這兩個版本是一樣的。您可以儘可能多地導入模塊,它只會「花費」一次。

順便說一句,「B將包含來自A和C的函數」的原因是錯誤的是,當您在A.py中執行import C時,A不包含「來自C的函數」。而是,A包含對C本身的引用。所以當你從B裏面導入A時,你會得到對C的引用,而不是對C內部函數的引用。如果你使用from C import blahBlah將C的各個部分直接導入到A的命名空間中,那麼當你導入A時,你將有權訪問這些功能爲A的成員。

# A.py 
from C import blah 

# B.py 
import A 
A.blah # this will work 
+0

您可以使用'is'運算符來驗證這一點。在這種情況下,'C是A.C'將是真的 – 2012-07-15 19:47:11

+0

很酷..所以我想所有的python都有參考模塊,而不是實際上「導入」的傳統意義上?謝謝! – Laz 2012-07-16 16:04:10