Python包中__init__.py文件的作用與用法實(shí)例詳解
前言
在Python工程中,我們經(jīng)??梢钥吹綆в?ldquo;__init__.py”文件的目錄,在PyCharm中,帶有這個(gè)文件的目錄被認(rèn)為是Python的包目錄,與目錄的圖標(biāo)有不一樣的顯示。如下圖所示, dir_example是一個(gè)空白目錄,圖標(biāo)是個(gè)文件夾圖標(biāo),而init_example下有_init__.py文件,其圖標(biāo)是一個(gè)包。
那么這個(gè)文件的作用是什么,我們平時(shí)如何使用呢?
一、__init__.py文件簡(jiǎn)介
Python 定義了兩種類型的包,常規(guī)包和命名空間包。常規(guī)包是傳統(tǒng)的包,因?yàn)樗鼈兇嬖谟?Python 3.2 和更早的版本中。一個(gè)常規(guī)包通常被實(shí)現(xiàn)為一個(gè)包含__init__.py 文件的目錄。當(dāng)一個(gè)常規(guī)包被導(dǎo)入時(shí),這個(gè)__init__.py文件被隱式執(zhí)行,它所定義的對(duì)象被綁定到包的名字空間中。
這是Python官方文檔中對(duì)__init__.py文件的描述,其實(shí)它的意思很簡(jiǎn)單,就是說(shuō)Python文件都是按照目錄當(dāng)作不同的模塊來(lái)組織的,這個(gè)目錄被認(rèn)為是Python包目錄,Python會(huì)通過(guò)搜索該目錄下的文件來(lái)導(dǎo)入相關(guān)的模塊。但是并不是所有的目錄都會(huì)被搜索添加,只有當(dāng)目錄中包含__init__.py文件時(shí),這個(gè)目錄才會(huì)被Python當(dāng)作是一個(gè)包目錄,進(jìn)而搜索添加里面的文件。這樣做可以讓編程者自己控制哪些目錄可以被Python導(dǎo)入成包。
當(dāng)某個(gè)目錄中包含__init__.py文件時(shí),Python在引入這個(gè)模塊之前,會(huì)首先執(zhí)行這個(gè)文件。因此,這個(gè)文件也可以被編程者用來(lái)控制定義包級(jí)別的變量。
綜上所述,__init__.py文件最主要的作用是2個(gè):
當(dāng)目錄下包含這個(gè)文件時(shí),Python會(huì)將其當(dāng)作成包目錄,進(jìn)而可以使用import xx.xx的方式導(dǎo)入目錄下的文件或者模塊。
使用__init__.py文件可以控制模塊導(dǎo)入時(shí)的變量和內(nèi)容,便于編程者的控制。
下面我們看幾個(gè)例子即可。
二、__init__.py文件的使用案例
2.1、沒(méi)有__init__.py文件的目錄,使用import xx.xx會(huì)報(bào)錯(cuò)嗎?
看版本,在較低的版本中(如3.2及以下),沒(méi)有__init__.py文件的目錄不能使用import xx.xx導(dǎo)入相關(guān)模塊,但是后面的版本可以。
2.2、在__init__.py文件中定義變量或者邏輯將在導(dǎo)入時(shí)候被執(zhí)行
例如,我們有如下的目錄結(jié)構(gòu):
init_example/ a_pkg/
__init__.py
a.py
init_test.py
即init_example工程下有個(gè)init_test.py文件和a_pkg目錄,a_pkg目錄下有__init__.py文件和一個(gè)a.py文件。
我們?cè)赼_pkg目錄下的__init__.py文件定義:
print("Hey, I am a __init__.py file")
那么,如果我們?cè)趇nit_test.py中內(nèi)容如下:
from a_pkg import *
執(zhí)行init_test.py我們可以得到如下結(jié)果:
Hey, I am a __init__.py file
因?yàn)樵趂rom a_pkg import *時(shí)候,會(huì)首先執(zhí)行a_pkg目錄下的__init__.py文件。
2.3、在__init__.py文件中定義變量或者方法,可以被直接導(dǎo)入使用
還是上面的目錄,假如我們?cè)赼_pkg目錄下的a.py定義如下內(nèi)容:
def a_method(): ? ? ? ? print("I am a_pkg!")
在a_pkg目錄下的__init__.py文件定義:
from a_pkg.a import a_method
那么,我們?cè)趇nit_test.py中引入a_pkg可以直接引入a_method方法:
from init_example.a_pkg import a_method a_method()
會(huì)打印如下內(nèi)容:
I am a_pkg!
2.4、在__init__.py文件中使用__all__方法
__all__方法可以在__init__.py文件定義一些包或者變量,可以在使用
from init_example.a_pkg import *
時(shí)定義*表達(dá)的內(nèi)容。
例如還是上面的內(nèi)容,但是我們?cè)赼_pkg目錄下的__init__.py文件定義:
__all__ = ["a"]
那么,我們?cè)趇nit_test.py中使用下面的語(yǔ)句可以引入a模塊:
from a_pkg import * a.a_method()
這時(shí)候依然會(huì)打印如下內(nèi)容:
I am a_pkg!
總結(jié)
到此這篇關(guān)于Python包中__init__.py文件的作用與用法的文章就介紹到這了,更多相關(guān)Python包__init__.py文件用法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 實(shí)現(xiàn)從高分辨圖像上摳取圖像塊
今天小編就為大家分享一篇python 實(shí)現(xiàn)從高分辨圖像上摳取圖像塊,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01python+requests接口壓力測(cè)試500次,查看響應(yīng)時(shí)間的實(shí)例
這篇文章主要介紹了python+requests接口壓力測(cè)試500次,查看響應(yīng)時(shí)間的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-04-04python算法學(xué)習(xí)雙曲嵌入論文方法與代碼解析說(shuō)明
這篇文章主要為大家介紹了python算法學(xué)習(xí)雙曲嵌入論文方法與代碼的實(shí)現(xiàn)解析說(shuō)明,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11代碼講解Python對(duì)Windows服務(wù)進(jìn)行監(jiān)控
本篇文章給大家分享了通過(guò)Python對(duì)Windows服務(wù)進(jìn)行監(jiān)控的實(shí)例代碼,對(duì)此有興趣的朋友可以學(xué)習(xí)參考下。2018-02-02Python的Flask框架開(kāi)發(fā)驗(yàn)證碼登錄的實(shí)現(xiàn)
在本文我們介紹了如何使用Python的Flask框架開(kāi)發(fā)一個(gè)簡(jiǎn)單的驗(yàn)證碼登錄功能,將涵蓋生成驗(yàn)證碼、處理用戶輸入、驗(yàn)證驗(yàn)證碼以及實(shí)現(xiàn)安全的用戶認(rèn)證等方面,感興趣的可以了解一下2023-11-11