__init__.py的相關(guān)解釋

參考鏈接:http://blog.csdn.net/zyl1042635242/article/details/44196601

? Python中常見(jiàn)的文件導(dǎo)入模式:事先寫(xiě)好一個(gè).py文件抓韩,如果在另一個(gè).py文件中需要導(dǎo)入事先寫(xiě)好的.py文件時(shí),就將事先寫(xiě)好的.py文件拷貝到當(dāng)前目錄若未,或者是sys.path增加事先寫(xiě)好的.py文件所在的目錄寿羞,然后import步脓。這種做法對(duì)于少數(shù)文件是可行的,但如果程序數(shù)目多柿隙,層級(jí)復(fù)雜骑疆,就不適用敛滋。鑒于此许布,我們希望找到一種辦法,像Java的Package一樣绎晃,能將多個(gè).py文件組織起來(lái)蜜唾,以實(shí)現(xiàn)在外部統(tǒng)一調(diào)用和在內(nèi)部互相調(diào)用。

其實(shí)庶艾,主要是用到Python的包的概念袁余,而__init__.py在包里起著重要作用。要弄明白這個(gè)問(wèn)題咱揍,首先要知道颖榜,Python在執(zhí)行import語(yǔ)句時(shí),到底進(jìn)行了什么操作煤裙,按照python的文檔掩完,它執(zhí)行了如下操作:

第1步,創(chuàng)建一個(gè)新的硼砰,空的module對(duì)象(它可能包含多個(gè)module)

第2步且蓬,把這個(gè)module對(duì)象插入sys.module中

第3步,裝載module的代碼(如果需要题翰,首先必須編譯)

第4步恶阴,執(zhí)行新的module中對(duì)應(yīng)的代碼。

在執(zhí)行第3步時(shí)豹障,首先要找到module程序所在的位置冯事。其原理為:如果需要導(dǎo)入的module的名字是m1,則解釋器必須找到m1.py血公,它首先在當(dāng)前目錄查找昵仅,然后是在環(huán)境變量PYTHONPATH中查找。PYTHONPATH可以視為系統(tǒng)的PATH變量一類(lèi)的東西坞笙,其中包含若干個(gè)目錄岩饼。如果PYTHONPATH沒(méi)有設(shè)定荚虚,或者找不到m1.py,則繼續(xù)搜索與Python的安裝設(shè)置相關(guān)的默認(rèn)路徑籍茧。正因?yàn)榇嬖谶@樣的順序版述,如果當(dāng)前路徑或PYTHONPATH中存在與標(biāo)準(zhǔn)module同樣的module,則會(huì)覆蓋標(biāo)準(zhǔn)module寞冯。也就是說(shuō)渴析,如果當(dāng)前目錄下存在xml.py,那么執(zhí)行import xml時(shí)吮龄,導(dǎo)入的是當(dāng)前目錄下的module俭茧,而不是系統(tǒng)標(biāo)準(zhǔn)的xml。

了解了這些漓帚,我們就可以先構(gòu)建一個(gè)package母债,以普通module的方式導(dǎo)入,就可以直接訪(fǎng)問(wèn)此package中的各個(gè)module了尝抖。Python中的package定義很簡(jiǎn)單毡们,其層次結(jié)構(gòu)與程序所在目錄的層次結(jié)構(gòu)相同,這一點(diǎn)與Java類(lèi)似昧辽,唯一不同的地方在于衙熔,python中的package必須包含一個(gè)__init__.py的文件。

例如搅荞,我們可以這樣組織一個(gè)package:

package1/

??? __init__.py

??? subPack1/

??? ??? __init__.py

??? ??? module_11.py

??? ??? module_12.py

??? ??? module_13.py

??? subPack2/

??? ??? __init__.py

??? ??? module_21.py

??? ??? module_22.py

……

__init__.py可以為空红氯,只要它存在,就表明此目錄應(yīng)被作為一個(gè)package處理咕痛。當(dāng)然痢甘,__init__.py中也可以設(shè)置相應(yīng)的內(nèi)容,下文詳細(xì)介紹暇检。好了产阱,現(xiàn)在我們?cè)趍odule_11.py中定義一個(gè)函數(shù):

def funA():

??? print "funcA in module_11"

??? return

在頂層目錄(也就是package1所在的目錄,當(dāng)然也參考上面的介紹块仆,將package1放在解釋器能夠搜索到的地方)運(yùn)行python:

>>>from package1.subPack1.module_11 import funcA

>>>funcA()

funcA in module_11

這樣构蹬,我們就按照package的層次關(guān)系,正確調(diào)用了module_11中的函數(shù)悔据。

細(xì)心的用戶(hù)會(huì)發(fā)現(xiàn)庄敛,有時(shí)在import語(yǔ)句中會(huì)出現(xiàn)通配符*,導(dǎo)入某個(gè)module中的所有元素科汗,這是怎么實(shí)現(xiàn)的呢藻烤?

答案就在__init__.py中。我們?cè)趕ubPack1的__init__.py文件中寫(xiě)

__all__ = ['module_13', 'module_12'] ,然后進(jìn)入python

>>>from package1.subPack1 import *

>>>module_11.funcA()

Traceback (most recent call last):

? File "", line 1, in ImportError: No module named module_11

也就是說(shuō),以*導(dǎo)入時(shí)怖亭,package內(nèi)的module是受__init__.py限制的涎显。

好了,最后來(lái)看看兴猩,如何在package內(nèi)部互相調(diào)用期吓。如果希望調(diào)用同一個(gè)package中的module,則直接import即可倾芝。也就是說(shuō)讨勤,在module_12.py中,可以直接使用

import module_11

如果不在同一個(gè)package中晨另,例如我們希望在module_21.py中調(diào)用module_11.py中的FuncA潭千,則應(yīng)該這樣:

from module_11包名.module_11 import funcA

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市借尿,隨后出現(xiàn)的幾起案子刨晴,更是在濱河造成了極大的恐慌,老刑警劉巖垛玻,帶你破解...
    沈念sama閱讀 218,755評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件割捅,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡帚桩,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)嘹黔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)账嚎,“玉大人,你說(shuō)我怎么就攤上這事儡蔓」叮” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 165,138評(píng)論 0 355
  • 文/不壞的土叔 我叫張陵喂江,是天一觀(guān)的道長(zhǎng)召锈。 經(jīng)常有香客問(wèn)我,道長(zhǎng)获询,這世上最難降的妖魔是什么涨岁? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,791評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮吉嚣,結(jié)果婚禮上梢薪,老公的妹妹穿的比我還像新娘。我一直安慰自己尝哆,他們只是感情好秉撇,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,794評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般琐馆。 火紅的嫁衣襯著肌膚如雪规阀。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,631評(píng)論 1 305
  • 那天瘦麸,我揣著相機(jī)與錄音姥敛,去河邊找鬼。 笑死瞎暑,一個(gè)胖子當(dāng)著我的面吹牛彤敛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播了赌,決...
    沈念sama閱讀 40,362評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼墨榄,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了勿她?” 一聲冷哼從身側(cè)響起袄秩,我...
    開(kāi)封第一講書(shū)人閱讀 39,264評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逢并,沒(méi)想到半個(gè)月后之剧,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,724評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡砍聊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,900評(píng)論 3 336
  • 正文 我和宋清朗相戀三年背稼,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片玻蝌。...
    茶點(diǎn)故事閱讀 40,040評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蟹肘,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出俯树,到底是詐尸還是另有隱情帘腹,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評(píng)論 5 346
  • 正文 年R本政府宣布许饿,位于F島的核電站谭确,受9級(jí)特大地震影響谬莹,放射性物質(zhì)發(fā)生泄漏剃允。R本人自食惡果不足惜逮刨,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,364評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望翘贮。 院中可真熱鬧赊窥,春花似錦、人聲如沸狸页。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,944評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至址遇,卻和暖如春熄阻,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背倔约。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,060評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工秃殉, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人浸剩。 一個(gè)月前我還...
    沈念sama閱讀 48,247評(píng)論 3 371
  • 正文 我出身青樓钾军,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親绢要。 傳聞我的和親對(duì)象是個(gè)殘疾皇子吏恭,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,979評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容