2012-06-13 109 views
1

換句話說,使用foo我需要進口一切都交給foo,如:在Python中,爲什麼我不能這樣做:import A; ABCfoo()

from A.B.C import foo 

或至多

from A.B import C 
C.foo() 

但我不能這樣做:

from A import B 
B.C.foo() 

這給了我一些像'module' object has no attribute "C"

+0

你*可*做你想做的 - 如果模塊筆者構建自己的代碼的方式允許它。 – Daenyth

+0

B是一個文件夾,是否有__init \ _ \ _。py文件? –

+0

[在Python中導入包]可能的重複(http://stackoverflow.com/questions/9048518/importing-packages-in-python) – Ben

回答

4

文檔解釋了爲什麼:http://docs.python.org/tutorial/modules.html

每個模塊都有自己的專用符號表,被用作由模塊中定義的所有功能 全局符號表。因此,模塊的作者可以在模塊中使用全局變量,而不用擔心與用戶的全局變量發生意外衝突。另一方面,如果你知道自己在做什麼,你可以觸摸一個 模塊的全局變量,使用相同的符號來表示它的 函數modname.itemname。

http://docs.python.org/tutorial/classes.html#python-scopes-and-namespaces

嚴格地說,在模塊名稱的引用是屬性 引用:在表達式modname.funcname中,modname是一個模塊 對象和funcname是它的一個屬性。在這種情況下,發生 是模塊屬性和模塊中定義的全局名稱之間的直接映射:它們共享相同的名稱空間!

因此,簡單的B.C沒有被導入,並且在最後一個例子中是未知的。 但是這將工作:

from A import B.C 
B.C.foo() 
相關問題