python 中的__init__.py的用法與個人理解


使用Python模塊常見的情況是,事先寫好A.py文件,需要import B.py文件時,先拷貝到當前目錄,然后再import

這樣的做法在程序量較小的情況下是可行的,如果程序交互復雜程度稍高,就很費力了

有一種解決方法可以將多個.py文件組織起來,方便在外部統一調用,和在內部互相調用:python中的 __ init__.py在包調用中起到了重要的作用

首先要明確的Python在執行import包的時候,執行的操作,按照python的文檔描述,操作如下:

a) 創建一個新的,空的module對象(它可能包含多個module);
b) 把這個module對象插入sys.module中
c) 裝載module的代碼(如果需要,首先必須編譯) (首先需要找到module程序所在的位置,其原理為:如果需要導入的module的名字是m1,則解釋器必須找到m1.py,它首先在當前目錄查找,然后是在環境變量PYTHONPATH中查找)
d) 執行新的module中對應的代碼。

Python中的package定義很簡單,其層次結構與.py所在目錄的層次結構相同,比較關鍵的一點是package中必須包含一個__init__.py的文件

例如,我們可以這樣組織一個package: init為頂層目錄

在這里插入圖片描述

運行結果如下

在這里插入圖片描述

其中__init__.py可以為空,只要它存在,解釋器對其視作一個package處理。

第一層:pack, pack2, main.py

第二層:
pack: __ init__.py,module_A.py

pack2:__ init__.py,module_B.py

PS:遇到問題沒人解答?需要Python學習資料?可以加點擊下方鏈接自行獲取
note.youdao.com/noteshare?id=2dce86d0c2588ae7c0a88bee34324d76

main.py 調用腳本:

from pack import func1
from pack import func2
from pack2 import print_lst
def main():
    func1()
    func2()
    print_lst()

if __name__ == "__main__":
    main()

其中 module_A:

def func1():
    print("MODULEAAAAA_func1111")

def func2():
    print("MODULEAAAAA_func2222")

同一層 __init __.py

from .module_A import func1
from .module_A import func2

.module_A 表示__ init__.py同一層目錄的module_A

個人理解是:當 main.py調用腳本from pack import func1

由於from操作 會默認目錄下存在pack包,解釋器會首先尋找__init__.py

而__init__.py內容不為空,對module_A引入了兩個函數fun1,fun2,生成了函數引用域(太菜不知道專屬名詞)

所以在main.py 中可以不顯式地指明module_A而直接用: from pack import fun1,fun2

如果把pack下的init.py 的第二行 import func2注釋

在這里插入圖片描述

也就是說,package內的module的import 是受__ init__.py限制的

有時在import語句中會出現通配符*,導入某個module中的所有元素,這是怎么實現的呢?
答案就在__init__.py中。如果在__init__.py文件中寫(指定)

__all__ = ['module_A']

如果改為

__all__ = []
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ImportError: No module named module_A

運行則會報錯,如上

這也就是說,package內的module的導入是受__init__.py限制的

好了,最后來看看,如何在package內部互相調用。

如果希望調用同一個package中的module,則直接import即可。

也就是說,在module_A.py中,可以直接使用import module_others
如果不在同一個package中,例如我們希望在module_A.py中調用module_B.py中的FuncB,則應該這樣:
from module_B的包名(目錄).module_B import funcB


免責聲明!

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



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