摘要:原理根據的開發文檔,模塊導入主要有以下的步驟,創建一個新空的對象它可能包含多個,把這個對象插入中,裝載的代碼如果需要,首先必須編譯,執行新的中對應的代碼。因此可以將初始化代碼放入該文件中。
@
開始拿著github上的python
代碼狂啃時,發現很多知道干嘛又不知道為啥這樣的代碼,開始瘋狂補漏。???
比如這樣的架構:
package1/ -- subPack1/ -- __init__.py -- module_11.py -- module_12.py -- module_13.py --subPack2/ -- __init__.py -- module_21.py -- module_22.py ……
? 如果想在module_21.py
中導入module_11.py
的某一個class或者function時,則需要subPack1中包含__init__.py
,即使__init__.py
是空的也可以,否則會報錯找不到module。
根據python的開發文檔,模塊導入主要有以下的步驟:
1,創建一個新空的module對象(它可能包含多個module)
2,把這個module對象插入sys.module中
3,裝載module的代碼(如果需要,首先必須編譯)
4,執行新的module中對應的代碼。
在執行第3步時,首先要找到module程序所在位置,其查找順序如下
1.在當前路徑以及當前目錄指定的sys.path
2.從環境變量PYTHONPATH進行查找
3.python
的安裝設置相關的默認路徑
? 如果當前路徑或者PYTHONPATH存在與標準module相同的module,則會覆蓋標準module,也就是說,如果當下目錄存在xml.py
那么執行import xml.py
時,導入的當前目錄下的module,而不是系統標準的xml。
? 那現在問題來了,怎么知道去哪兒找這些模塊呢,有的文件夾我想被搜索,有的文件夾不想被搜索,這里就需要__init__.py
文件了,在文件夾下面有這個文件,則默認該文件夾是個package,可以被搜索到。這是__init__.py
的用處之一。
? 比如有個python文件依賴上面的所有文件:
from package1.subPack1 import module_11from package1.subPack1 import module_12from package1.subPack1 import module_21from package1.subPack2 import module_22from package1.subPack2 import module_23
?這個例子里面文件比較少,如果模塊比較大,目錄比較深的話,可能自己都記不清該如何導入。這種情況下,__init__.py
就很有作用了。我們先來看看該文件是如何工作的。
? 實際上,如果目錄中包含了 __init__.py
時,當用 import 導入該目錄時,會優先執行 __init__.py
里面的代碼。
? 我們在package1目錄下增加一個__init__.py
文件:
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
里面print一句話print("the package1 is loaded ")
,再在python下導入包
>>python>>import package1the package1 is loaded
這樣我們就可以在__init__.py
里面導入需要文件包:
from package1.subPack1 import module_11
然后在python里面導入整個包:
import package1
如果要導入package1下面整個文件夾下面的包,則偷懶一點:
from package1 import *
這里引出了另外一個問題,為啥* 能導入所有的模塊呢,這里涉及到一個變量__all__
(這里后續補充)
綜上,在了解了 __init__.py
的工作原理后,應該能理解該文件就是一個正常的python代碼文件?!∫虼丝梢詫⒊跏蓟a放入該文件中。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/125015.html
摘要:文件和導包總結也是一門學問導入方式的作用把某一個目錄變成一個包,使得其他模塊使用包包中的某一模塊函數變量類這種方式時可用什么時候有用如果某一個目錄在后期導入使用時只是作為中間目錄銜接使用,則可以不加,如果某個目錄后期會被直接或間接顯示地作為 python __init__.py文件和導包總結 import也是一門學問~ 導入方式 import from xxx import y...
摘要:所以在多線程中,線程的運行仍是有先后順序的,并不是同時進行。哈希函數的目的是使鍵均勻地分布在數組中。由于不同的鍵可能具有相同的哈希值,即可能出現沖突,高級的哈希函數能夠使沖突數目最小化。 首先這篇文章在我的《Python數據結構》公眾號已經提及,但是本篇文章提供了更為高級的解法,來發散大家的思維;同時為大家提供我的草稿py文件,大家可以關注《Python數據結構》公眾號后恢復 120 ...
摘要:當功能越來越復雜的時候,你可能修改了一些東西,導致另外一個功能的不可用,而單元測試也能保證了原有功能被破壞后能被檢測出來。 showImg(https://segmentfault.com/img/remote/1460000017081749); 前言 前一篇講到了 TDD 測試驅動開發的相關概念和環境搭建,這篇就著手開始用TDD方式開發了。首先這篇需要編寫用戶相關的API接口,如...
摘要:擴展支持多用戶并發訪問與線程池。項目請見初學網絡編程之服務器。不允許超過磁盤配額。該文件是一個使用模塊編寫的線程池類。這一步就做到了線程池的作用。 對MYFTP項目進行升級。擴展支持多用戶并發訪問與線程池。MYFTP項目請見python初學——網絡編程之FTP服務器。 擴展需求 1.在之前開發的FTP基礎上,開發支持多并發的功能2.不能使用SocketServer模塊,必須自己實現多線...
摘要:中常用的幾個框架有等,今天來總結一下和的不同。本文使用的環境是。文件可以加載路由信息和項目配置信息,文件負責啟動項目。以上就簡單的比較了和幾個方面的不同,它們各有優缺點,實際工作中可以根據不同的需求選擇不同的框架進行開發。 python中常用的幾個web框架有django, tornado, flask等,今天來總結一下django和tornado的不同。工作中django和torna...
閱讀 3316·2021-11-25 09:43
閱讀 1303·2021-11-23 09:51
閱讀 3608·2021-10-11 11:06
閱讀 3697·2021-08-31 09:41
閱讀 3597·2019-08-30 15:53
閱讀 3509·2019-08-30 15:53
閱讀 965·2019-08-30 15:43
閱讀 3306·2019-08-29 14:02