我剛剛讀過一篇文章,該文章將我介紹給一個新概念:到目前爲止,我確信python軟件包(即具有__init__.py
文件的目錄)的行爲與java軟件包的行爲完全相同,即 - 小小的名稱空間安排代碼(減去java的「包」範圍)。 但是,根據這個鏈接: A Short Digression Into Multi-File Modules,如果我把我在同一個「包」中的所有文件:Python包(多文件模塊)的行爲與一個大模塊完全相同嗎?
文件的整個集合呈現給其他的Python代碼作爲一個單獨的模塊 - 好像所有的函數和類是在一個單一的.py
所以現在我認爲我對python「包」的完整理解是錯誤的。而且 - 它完全不是一個軟件包,而是作者提到的「多文件模塊」。
因此,根據我的理解,無論我將我的funcs和classes劃分爲多少個文件,從包的外部看起來好像我從包中的所有文件中取出所有代碼,它在一個與包相同的大文件中,即作爲一個模塊。
例如,如果我有以下文件結構:
/base
/animals
/__init__.py
/dog.py
和dog.py:
def bark():
print "woof"
它應該是完全一樣的有:
/base
/animals.py
和animals.py:
在第一種情況下from base import animals
animals.bark()
當然收益率的這種:
因此,這未來一段代碼應在這兩種情況下運行良好
Traceback (most recent call last):
File "<console>", line 1, in <module>
AttributeError: 'module' object has no attribute 'bark'
缺少什麼我在這裏?我發現,「動物」確實被視爲一個模塊,但看起來我仍然必須明確指出animals.dog.bark
,即包的內部文件結構不是從外部抽象出來的。
我是否遺漏了作者的觀點,或者只是沒有正確實施?
===編輯===
只是爲了確保沒有人錯過該線路報價:
好像所有的功能和類是在一個單身。PY
不管如何實際訪問此funcs中和類,以上報價明確規定,如果你在文件中的一個FUNC1和FUNC2文件B中,無論哪條路徑將它們從接近,如果我們將此路徑表示爲X,則根據上述報價,X.func1
和X.func2
都應該起作用。
我無法在鏈接頁面上找到該報價。小心再試一次? – 2010-03-06 14:28:00
@Ignacio:http://diveintopython3.org/case-study-porting-chardet-to-python-3.html#multifile-modules – unutbu 2010-03-06 14:48:35
@ignacio - 抱歉,更正鏈接 – olamundo 2010-03-06 14:51:51