dir1和dir1.dir2目前是空包,或者說是空模塊(再一次強調(diào),包就是模塊)。但并不意味著它們對應(yīng)的模塊對象是空的,因為模塊是對象,只要是對象就會有屬性。例如,dir1包有如下屬性:
>>>dir(dir1)
['__doc__','__loader__','__name__','__package__','__path__','__spec__','dir2']
之所以稱為空包,是因為它們現(xiàn)在僅提供了包的組織功能,而且它們是目錄,而不像py文件一樣,是實實在在的可以編寫模塊代碼的地方。換句話說,包現(xiàn)在是目錄文件,而不是真正的模塊文件。
為了讓包"真正的"成為模塊,需要在每個包所代表的目錄下加入一個__init__.py文件,它表示讓這個目錄格式的模塊(也就是包)像py文件一樣可以寫模塊代碼,只不過這些模塊代碼是寫入__init__.py中的。當(dāng)然,模塊文件中允許沒有任何內(nèi)容,所以__init__.py文件也可以是空文件,它僅表示讓包成為真正的模塊文件。
每次導(dǎo)入包的時候,如果有__init__.py文件,將會自動執(zhí)行這個文件中的代碼,就像模塊文件一樣,事實上它就是讓目錄代表的包變成模塊的,甚至可以說它就是包所對應(yīng)的模塊文件(見下面示例),所以也可以認(rèn)為__init__.py是包的初始化文件。在python3.3之前,這個文件必須存在,否則就會報錯,因為它不認(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。
實際上,包分為兩種:名稱空間模塊、普通模塊。名稱空間包是沒有__init__.py文件的,普通包是有__init__.py文件的。無論是哪種,它都是模塊。
以上內(nèi)容為大家介紹了Python中的__init__.py文件,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機構(gòu):千鋒教育。