標籤:
模組
模組是python中的最高組織單元,在物理層面上,模組以檔案儲存體,模組的檔案名稱就是模組的名字.py,每個模組都有自己的名稱空間。
python按照路徑搜尋來尋找模組檔案,在PYTHONPATH環境變數中的路徑為Python模組的搜尋路徑,通過sys.path屬性可以看到模組搜尋路徑的列表,python按照這個列表的順序對模組進行搜尋,所以在路徑列表前面的路徑搜尋到模組之後就不會繼續搜尋。由於該值是一個列表,可以通過sys.path.append方法,或者sys.path.insert方法添加路徑到該列表中,或者通過sys.path.pop方法將某些路徑排除到搜尋路徑之外等等。
包
模組的物理層面是檔案,包就是有層次的特殊檔案結構,特殊的點在於,每個目錄下面都必須有__init__.py檔案,如果沒有該檔案,則只是一個普通的檔案目錄,並不能作為包匯入。這是因為匯入包的原理其實就是匯入該包的路徑下面的__init__.py,其中包含可以匯入的各種模組。
模組匯入和載入
通過import、from ? import語句匯入一個模組,或者通過as給模組起別名,模組只有在第一次匯入的時候才會被載入,模組載入時,其實就是執行模組中的所有語句,此時,如果模組中除了定義的類和方法之外,在頂級範圍下有代碼時,這些代碼會被執行,所以在模組編寫中需要避免在頂級範圍下直接執行代碼。
在模組第一次被匯入時,往往會比較慢,這是因為python在匯入一個新的模組時,會從模組所在目錄檢查是否有.pyc檔案,如果沒有該檔案,則會將模組編譯成位元組碼,從而提高下一次匯入的效率。
python也可以從一個ZIP檔案中匯入模組,該ZIP檔案會被看成一個包,然而python不會再產生.pyc檔案到該ZIP檔案中,所以匯入效率相對較低一些。
名稱空間
名稱空間指標示符到對象的映射,python在執行過程中,有兩個或者三個活動的名稱空間:局部名稱空間、全域名稱空間、內建名稱空間。內建名稱空間的所有名字都包含在__builtins__模組中,該模組又包含__buitin__模組,該模組中包含內建函數、異常以及其他屬性,每一個python程式執行之前都會先匯入__builtins__模組,每個模組都有自己的名稱空間,匯入一個模組時,會載入執行模組的全域名稱空間,這也是為什麼在載入一個模組時,所有頂級範圍下的代碼會直接執行。
名稱空間和範圍的關係:所有局部名稱空間的名稱都在局部作用範圍內,局部名稱空間之外的所有名稱都在全域作用範圍內。局部名稱空間和範圍會隨著函數的調用而不斷變化,但是全域名稱空間是不變的。名稱空間決定一個變數名字是否存在,而範圍決定一個變數名字是否可以被訪問到。通過globals()、locals()內建函數可以判斷出某一名字屬於哪個名稱空間。在訪問一個屬性的時候,會從局部名稱空間、全域名稱空間、內建名稱空間中尋找該名字,如果都找不到則會返回一個NameError的錯誤,由於尋找時總是先去尋找局部名稱空間,所以局部名稱空間中如果有和全域名稱空間中的變數重名,則會講全域名稱空間中的變數“覆蓋”(其實是不會再被找到)。
內建函數
__import__()函數,實際上import語句調用的就是__import__()函數來完成工作,通過重寫該函數,可以自訂匯入演算法,也可以使用md=__import__(‘module’) ,相當於 import module as ad。
globals()、locals() 返回全域名稱空間和局部名稱空間的字典,其鍵為名稱空間中的名字。
reload()函數可以從新載入一個模組,顧名思義,會講模組從新執行一次。
Python學習_09_模組