標籤:運行 方便 記憶體 collect 模組 無法 建立 pre 為我
一、模組的本質 我們寫python程式經常會匯入很多模組,那到底模組是什麼呢?其實模組就是一個python檔案,我們匯入模組時的模組名就是python檔案的名字,比如我們寫了一個叫my_module.py的檔案就可以當作模組匯入其他python檔案中,模組名就是my_module。 二、模組匯入的兩種方式 2.1、import 2.1.1、import匯入模組時會做三件事: 1、為該模組產生一個獨立的命名空間 2、在該命名空間中將模組的代碼執行一遍 3、建立模組名到該命名空間的引用 2.1.2、別名 當我們匯入的模組名太長不方便調用,或者跟我們自己定義的函數名或變數名有重名的時候怎麼辦呢?這個時候就可以使用as關鍵字給模組起個別名,之後在帶哦用模組中的函數或變數時就用這個別名就可以了,比如
import random as r
print(r.randint(1,5))
--------------------------------------------------------------------------------------
4
2.1.3、一行匯入多個模組 python支援import後跟多個模組名,用逗號分割即可
import random ,os,sys
2.2、from import 2.2.1、與import的區別 from import也會為模組建立獨立的命名空間,但是它直接將import後的名字匯入到了當前命名空間,我們可以直接使用這個名字不需要用模組名.名字的方式了,比如
from collections import namedtuplePoint=nametuple(‘Point‘,[‘x‘,‘y‘])p=Point(1,2)print(p.x,p.y)--------------------------------------------------------------------------------------1 2
但是需要注意的是,如果後面有跟這個匯入的名字重名的情況的話,這個被匯入的名字就會被後面的覆蓋了 2.2.2、別名 from import也支援使用as關鍵字給匯入的名字起別名,同樣在後續使用時也是使用這個別名了 2.2.3、同時匯入一個模組的多個名字 from import支援一行匯入多個名字,比如
from collections import namedtuple,OrderedDict,defaultdict,deque,CounterPoint=namedtuple(‘Point‘,[‘x‘,‘y‘])p=Point(1,2)print(p.x,p.y)--------------------------------------------------------------------------------------1 2
2.2.4、from import * from import *可以將模組中除了底線_開頭的變數外的所有名字都匯入當前命名空間,同時我們可以配合使用__all__=[‘名字1‘,‘名字2‘]的方式控制哪些名字可以被匯入,但是大部分情況下不建議這樣匯入,因為我們不知道模組中有哪些名字,會不會跟現有代碼中的名字重名 三、模組重新載入 python是不支援重新載入模組或者卸載已載入的模組的,因此一旦程式運行後,對模組的修改都不會生效,一般情況下只能重新啟動程式,但是有一種方法可以在程式啟動並執行時候重新載入模組,就是importlib模組的reload方法,在匯入了importlib模組後,我們可以使用importlib.reload(模組名)的方式重新載入模組,但是只建議在測試的時候使用。 四、控制模組的執行邏輯 在python內建的全域變數中有一個__name__的變數,它的值會根據python檔案被執行的方式不同而不同,如果python檔案是直接執行的那麼它的變數值就是__main__,如果是被當作模組間接執行的那麼它的變數值就是模組名,利用這個我們就可以控制一個python檔案中的代碼在直接執行時才執行否則就不執行 五、模組搜尋順序 python在搜尋模組時會先找記憶體中已載入的模組,然後到內建模組中尋找,最後從sys.path中包含的路徑中按順序尋找,這裡我們需要注意一點,我們自己定義的模組名不要跟內建模組重名,否則重名的那個內建模組就無法使用 六、python編譯檔案 python解譯器在執行python時會把第一次載入的模組進行一次編譯產生.pyc的檔案,下次就會直接載入這個.pyc檔案而不是模組檔案,這樣的好處就是在模組載入的時候會加快速度,但是預設不會給其他python檔案產生.pyc檔案,我們可以在運行python檔案時用python -m XXX.py的方式讓python給這個python檔案也產生一個.pyc的檔案 七、包 python中的包其實就是一個包含__init__.py檔案的檔案夾,我們在匯入一個python包的時候實際上就是匯入了這個檔案而已。 絕對匯入:就是在from中指定具體的子模組路徑,比如from glance.cmd import manage 相對匯入:就是用點代表子模組前的路徑,子模組外有幾層包就需要幾個點,比如from .cmd import manage。相對匯入只能在同一個包內使用並且只有子模組被其他檔案匯入執行時才能正常執行。
python模組匯入