你經常看到卻經常忽視的 init

2022-05-30 01:24:10 字數 3228 閱讀 3626

python 初學者在閱讀一些 python 開源專案時,常常會看到乙個叫做__init__.py的檔案。下圖為著名的第三方庫requests的源**:

那麼__init__.py有什麼用呢?本文介紹它的兩個用途。

假設我們有兩個檔案main.pywriter.py,他們所在的檔案結構如下圖所示:

main.pydocparser資料夾下面;writer.pydocparser/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.有時經常在園子頭看別人寫一些自己的想法...