python 初學者在閱讀一些 python 開源專案時,常常會看到乙個叫做__init__.py
的檔案。下圖為著名的第三方庫requests
的源**:
那麼__init__.py
有什麼用呢?本文介紹它的兩個用途。
假設我們有兩個檔案main.py
與writer.py
,他們所在的檔案結構如下圖所示:
main.py
在docparser
資料夾下面;writer.py
在docparser/microsoft/docx/
資料夾下面。writer.py
檔案中有乙個函式write
。其內容如下:
現在我想在main.py
資料夾呼叫這個函式,那麼我有3種寫法:12
3from microsoft.word.docx.writer import write
write()
執行效果如下圖所示:
或者這樣寫:12
3from microsoft.word.docx import writer
writer.write()
執行效果如下圖所示:
或者這樣寫:12
3import microsoft.word.docx.writer
microsoft.word.docx.writer.write()
執行效果如下圖所示:
但無論那種方法,都要寫長長的路徑,甚為不便。這個時候,我們可以在microsoft
資料夾下面建立乙個__init__.py
檔案,並在裡面填寫如下內容:
此時,在main.py
,我們匯入write
函式,就像是從microsoft.py
檔案中匯入一樣。如下圖所示:
注意上面我說的是就像從microsoft.py 檔案
中匯入一樣,這裡是用的檔案
而不是資料夾
。
這是因為,當乙個資料夾裡面有__init__.py
以後,這個資料夾就會被 python 作為乙個包(package)
來處理。此時,對於這個包裡面層級比較深的函式、常量、類,我們可以先把它們匯入到__init__.py
中。這樣以來,包外面再想匯入這些內容時,就可以用from 包名 import 函式名
來匯入了。
為什麼會有包
這個東西呢?這是因為,當有一些**會在很多地方被使用時,我們可以把這些**打包起來,作為乙個公共的部分提供給其他模組呼叫。
由於呼叫包的其他模組所在的絕對路徑是千變萬化的,所以在包的內部呼叫自身其他檔案中的函式、常量、類,就應該使用相對路徑,而是絕對路徑。
例如,現在我在microsoft
資料夾下面再建立乙個parse.py
檔案,它需要匯入microsoft/word/docx/writer.py
中的write
函式,那麼**可以寫為:12
3456
from .word.docx.writer import write
def parse_doc():
print('現在在 parse.py 中呼叫 write 函式')
write()
如下圖所示:
可以看到,此時from .word.docx.writer
中的.
表示當前包,所以.word.docx.writer
表示當前包下面的word 資料夾下面的 docx 資料夾下面的 writer.py 檔案。
然後我們修改__init__.py
,把parse_doc
函式匯入進去,如下圖所示:
最後,在main.py
中呼叫這個parse_doc
函式,如下圖所示:
可以看到,在包裡面的乙個檔案呼叫這個包裡面的另乙個檔案,只需要知道另乙個檔案的相對位置就可以了,不用關心這個包被放在**。
並且,上面parse.py
中匯入write
函式的**還可以進一步簡化,由於write
函式已經被匯入到了__init__.py
中,所以我們可以直接從.
裡面匯入write
函式:
1from . import write
執行效果如下圖所示:
當乙個資料夾裡面包含__init__.py
時,這個資料夾會被 python 認為是乙個包(package)
,此時,包內部的檔案之間互相匯入可以使用相對匯入,並且通過提前把函式、常量、類匯入到__init__.py
中再在其他檔案中匯入,可以精簡**。
makefile裡經常看到sed指令
問題 這裡,我們給出了乙個模式規則來產生 d 檔案 d c set e rm f cc m cppflags sed s,o 1.o g rm f 這個規則的意思是,所有的 d 檔案依賴於 c 檔案,rm f 的意思是刪除所有的目標,也就是 d 檔案,第二行的意思是,為每個依賴檔案 也就是 c 檔案...
經常看美女的健康益處
期間的人,總是想各種各樣的方法讓自己少吃飯,很多人可能不知道,看美女也有 效果。日前,美國 食慾 雜誌載文指出,看美女能使人們吃得更少。來自瑞士的研究人員招募了一些志願者,把他們分為兩組,讓他們可以在5分鐘內盡情吃巧克力,並完成乙份味道評估問卷。在吃巧克力的過程中,第一組所在的房間裡,電腦螢幕不斷呈...
你是否經常想寫點什麼?
1.每當工作很忙時,總想等閒下來好好規劃一下,然後學點新知識,提公升一下自己 2.但是實際等空閒下來以後,又覺得好不容易忙完了,是否應該放鬆一下自己,先休息幾天?3.結果一放鬆,就休息沒頭了,接著就是下乙個忙的週期 4.這些年就一直陷入這樣乙個怪圈,如何破?5.有時經常在園子頭看別人寫一些自己的想法...