python中__init__.py作為封包的使用與模塊導入的執行過程


1.python中的Module是比較重要的概念。常見的情況是,事先寫好一個.py文 件,在另一個文件中需要import時,將事先寫好的.py文件拷貝 到當前目錄,或者是在sys.path中增加事先寫好的.py文件所在的目錄,然后import。這樣的做法,對於少數文件是可行的,但如果程序數目很多,層級很復雜,就很吃力了。有沒有辦法,像Java的Package一樣,將多個.py文件組織起來,這就用到了__init__的封包操作。

2.在使用__init__的封包操作之前,我們先了解下import語句時,python做了哪些操作

 1.創建一個新的,空的module對象

    2.把這個module對象插入sys.module中

    3.裝載module的代碼

    4.執行新的module中對應的代碼

在執行第3步時,首先要找到module程序所在位置,其查找順序如下

 1.在當前路徑以及當前目錄指定的sys.path

    2.從環境變量PYTHONPATH進行查找

 3.pyhon的安裝設置相關的默認路徑

如果當前路徑或者PYTHONPATH存在與標准module相同的module,則會覆蓋標准module,也就是說,如果當下目錄存在xml.py 那么執行import xml.py時,導入的當前目錄下的module,而不是系統標准的xml。

3.了解完python import導入的機制后,我們就可以先構建一個package,以普通module的方式導入,就可以直接訪問此package中的各個module了。

Python中的package定義很簡單,其層次結構與程序所在目錄的層次結構相同,這一點與Java類似,唯一不同的地方在於,python中的package必須包含一個__init__.py的文件。
例如,我們可以這樣組織一個package: (package1和package2為兩個同級的文件包)

package1/
    __init__.py
    module_a.py
    module_b.py
package2/
        __init__.py
        module_c.py

module_a.py中定義一個函數:
def funA():
    print ("我是來自 module_a")
    return 1
module_b.py中定義一個函數:
def funB():
    print ("我是來自 module_b")
    return 2

我們想在package2的module_c中執行funA 和funB

我們可以在 module_c.py中分別導入package1中的模塊 module_a.py和module_b.py。

from package1.module_a import funA
from package1.module_b import funB
funA()
funB()

上面一種方法雖然可以完成對文件模塊的導入,但是當我們想要在文件加載后第一時間執行,並且直接得出funA和funB的返回值相加。這個時候我們使用__init__的封包操作更為方便些:

我們可以對package1的__init__.py 定義一個funC:

from .module_a import funA
from .module_b import funB
def funC():
    ret1=funA()
    ret2=funB()
    return int(ret1)+int(ret2)

然后在我們想在package2的module_c直接從package1導入funC()即可

from .package1 import funC
funC()
*****執行結果*****
我是來自 module_a
我是來自 module_b

3

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM