dir1和dir1.dir2目前是空包,或者說(shuō)是空模塊(再一次強(qiáng)調(diào),包就是模塊)。但并不意味著它們對(duì)應(yīng)的模塊對(duì)象是空的,因?yàn)槟K是對(duì)象,只要是對(duì)象就會(huì)有屬性。例如,dir1包有如下屬性:
>>>dir(dir1)
['__doc__','__loader__','__name__','__package__','__path__','__spec__','dir2']
之所以稱為空包,是因?yàn)樗鼈儸F(xiàn)在僅提供了包的組織功能,而且它們是目錄,而不像py文件一樣,是實(shí)實(shí)在在的可以編寫模塊代碼的地方。換句話說(shuō),包現(xiàn)在是目錄文件,而不是真正的模塊文件。
為了讓包"真正的"成為模塊,需要在每個(gè)包所代表的目錄下加入一個(gè)__init__.py文件,它表示讓這個(gè)目錄格式的模塊(也就是包)像py文件一樣可以寫模塊代碼,只不過(guò)這些模塊代碼是寫入__init__.py中的。當(dāng)然,模塊文件中允許沒(méi)有任何內(nèi)容,所以__init__.py文件也可以是空文件,它僅表示讓包成為真正的模塊文件。
每次導(dǎo)入包的時(shí)候,如果有__init__.py文件,將會(huì)自動(dòng)執(zhí)行這個(gè)文件中的代碼,就像模塊文件一樣,事實(shí)上它就是讓目錄代表的包變成模塊的,甚至可以說(shuō)它就是包所對(duì)應(yīng)的模塊文件(見(jiàn)下面示例),所以也可以認(rèn)為_(kāi)_init__.py是包的初始化文件。在python3.3之前,這個(gè)文件必須存在,否則就會(huì)報(bào)錯(cuò),因?yàn)樗徽J(rèn)為目錄是有效的模塊。
現(xiàn)在,在dir1和dir2下分別創(chuàng)建空文件__init__.py:
typenul>d:pypathdir1__init__.py
typenul>d:pypathdir1dir2__init__.py
現(xiàn)在目錄的層次格式如下:
λtree/fd:pypath
D:PYPATH
└─dir1
│__init__.py
└─dir2
mod.py
__init__.py
再去執(zhí)行導(dǎo)入操作,并輸出包dir1和dir2。
>>>importdir1.dir2.mod
mod.py
>>>dir1
>>>dir1.dir2
>>>dir1.dir2.mod
從輸出結(jié)果中不難看出,包dir1和dir1.dir2是模塊,且它們的模塊文件是各自目錄下的__init__.py。
實(shí)際上,包分為兩種:名稱空間模塊、普通模塊。名稱空間包是沒(méi)有__init__.py文件的,普通包是有__init__.py文件的。無(wú)論是哪種,它都是模塊。
以上內(nèi)容為大家介紹了Python中的__init__.py文件,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。