越是不起眼的你越容易忽視,Python __init__.py的作用你知道嗎?

init.py 文件的作用是將文件夾變?yōu)橐粋€(gè)Python模塊,Python 中的每個(gè)模塊的包中,都有init.py 文件。私信小編回復(fù)基礎(chǔ)可以獲取python基礎(chǔ)視頻教程一套

通常init.py 文件為空,但是我們還可以為它增加其他的功能。我們?cè)趯?dǎo)入一個(gè)包時(shí),實(shí)際上是導(dǎo)入了它的init.py文件。這樣我們可以在init.py文件中批量導(dǎo)入我們所需要的模塊,而不再需要一個(gè)一個(gè)的導(dǎo)入。

越是不起眼的你越容易忽視,Python __init__.py的作用你知道嗎?

注意這里訪問init.py文件中的引用文件,需要加上包名。

init.py中還有一個(gè)重要的變量,all, 它用來將模塊全部導(dǎo)入。

越是不起眼的你越容易忽視,Python __init__.py的作用你知道嗎?

這時(shí)就會(huì)把注冊(cè)在init.py文件中all列表中的模塊和包導(dǎo)入到當(dāng)前文件中來。

可以了解到,init.py主要控制包的導(dǎo)入行為。要想清楚理解init.py文件的作用,還需要詳細(xì)了解一下import語句引用機(jī)制:

可以被import語句導(dǎo)入的對(duì)象是以下類型:

  • 模塊文件(.py文件)
  • C或C++擴(kuò)展(已編譯為共享庫或DLL文件)
  • 包(包含多個(gè)模塊)
  • 內(nèi)建模塊(使用C編寫并已鏈接到Python解釋器中)
  • 當(dāng)導(dǎo)入模塊時(shí),解釋器按照sys.path列表中的目錄順序來查找導(dǎo)入文件。
越是不起眼的你越容易忽視,Python __init__.py的作用你知道嗎?

其中l(wèi)ist第一個(gè)元素空字符串代表當(dāng)前目錄。

1.關(guān)于.pyc 文件 與 .pyo 文件

.py文件的匯編,只有在import語句執(zhí)行時(shí)進(jìn)行,當(dāng).py文件第一次被導(dǎo)入時(shí),它會(huì)被匯編為字節(jié)代碼,并將字節(jié)碼寫入同名的.pyc文件中。后來每次導(dǎo)入操作都會(huì)直接執(zhí)行.pyc 文件(當(dāng).py文件的修改時(shí)間發(fā)生改變,這樣會(huì)生成新的.pyc文件),在解釋器使用-O選項(xiàng)時(shí),將使用同名的.pyo文件,這個(gè)文件去掉了斷言(assert)、斷行號(hào)以及其他調(diào)試信息,體積更小,運(yùn)行更快。(使用-OO選項(xiàng),生成的.pyo文件會(huì)忽略文檔信息)

2.導(dǎo)入模塊

模塊通常為單獨(dú)的.py文件,可以用import直接引用,可以作為模塊的文件類型有.py、.pyo、.pyc、.pyd、.so、.dll

在導(dǎo)入模塊時(shí),解釋器做以下工作:

  1. 已導(dǎo)入模塊的名稱創(chuàng)建新的命名空間,通過該命名空間就可以訪問導(dǎo)入模塊的屬性和方法。
  2. 在新創(chuàng)建的命名空間中執(zhí)行源代碼文件。
  3. 創(chuàng)建一個(gè)名為源代碼文件的對(duì)象,該對(duì)象引用模塊的名字空間,這樣就可以通過這個(gè)對(duì)象訪問模塊中的函數(shù)及變量

import 語句可以在程序的任何位置使用,你可以在程序中多次導(dǎo)入同一個(gè)模塊,但模塊中的代碼僅僅在該模塊被首次導(dǎo)入時(shí)執(zhí)行。后面的import語句只是簡(jiǎn)單的創(chuàng)建一個(gè)到模塊名字空間的引用而已。

sys.modules字典中保存著所有被導(dǎo)入模塊的模塊名到模塊對(duì)象的映射。

3.導(dǎo)入包

多個(gè)相關(guān)聯(lián)的模塊組成一個(gè)包,以便于維護(hù)和使用,同時(shí)能有限的避免命名空間的沖突。一般來說,包的結(jié)構(gòu)可以是這樣的:

越是不起眼的你越容易忽視,Python __init__.py的作用你知道嗎?

有以下幾種導(dǎo)入方式:

import subpackage1.a 

# 將模塊subpackage.a導(dǎo)入全局命名空間,例如訪問a中屬性時(shí)用subpackage1.a.attr
from subpackage1 import a 
# 將模塊a導(dǎo)入全局命名空間,例如訪問a中屬性時(shí)用a.attr_a
from subpackage.a import attr_a 
# 將模塊a的屬性直接導(dǎo)入到命名空間中,例如訪問a中屬性時(shí)直接用attr_a

使用from語句可以把模塊直接導(dǎo)入當(dāng)前命名空間,from語句并不引用導(dǎo)入對(duì)象的命名空間,而是將被導(dǎo)入對(duì)象直接引入當(dāng)前命名空間。

學(xué)會(huì)了嗎?

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容