python 程式構架淺析
一、概念
定義:通常的 Python 程式的構架是指:將一個程式分割為原始碼檔案的集合以及將這些部分連線在一起的方法。
python的程式構架可表示為:
一個python程式就是一個模組的系統。它有一個頂層檔案(啟動後可執行程式)以及多個模組檔案(用來匯入工具庫)。
注:標準庫模組:python中自帶的實用模組,也稱為標準連結庫。則個集合體大約有200多個模組,包含於平臺不相關的常見程式設計任務:作業系統介面、物件永久儲存、文字匹配模式、網路和Internet指令碼、GUI建構等。注意:這些工具都不是Python語言的組成部分,但是,可以在任何安裝了標準Python的情況下,匯入適當的模組來使用。
二、模組
概念:模組時Python 中最高級別的組織單元,它將程式程式碼和資料封裝起來以便重用。其實,每一個以副檔名 .py 結尾的Python檔案都是一個模組。
模組的三個角色:
(1)程式碼重用;
(2)系統 名稱空間的劃分(模組可理解為變數名的封裝,即模組就是名稱空間);
(3)實現共享服務和資料。
程式和模組:Python中,程式是作為一個主體的、頂層的檔案來構造的,配合有零個或多個支援的檔案,而後者這些檔案都可以稱作模組(頂層的檔案也可以作為模組使用,但一般情況不作為模組)。
頂層檔案:包含了程式的主要的控制流程:即需要執行來啟動應用的檔案。
模組檔案:可看做是工具的倉庫(即裝滿了工具),這些工具是用來收集頂層檔案(或其他可能的地方)使用的元件。
頂層檔案與模組檔案:頂層檔案使用了在模組檔案中定義的工具,為這些模組也使用了其他模組所定義的工具。
模組的執行環境:模組包含變數、函式、類以及其他的模組(如果匯入的話),而函式也有自己的本地變數。下圖描述了模組內的情況以及與其他模組的互動,即 模組的執行環境:
可見:模組可以被匯入,但模組也會匯入和使用其他模組,這些模組可以用Python或其他語言(如,C語言)寫成。
三、import(匯入)
概念:一個檔案可通過匯入一個模組(檔案)讀取這個模組的內容,即匯入從本質上講,就是在一個檔案中載入另一個檔案,並且能夠讀取那個檔案的內容。一個模組內的內容通過這樣的屬性(object . attribute)能夠被外界使用。
匯入是Python中程式結構的重點所在。
1、import a module 四種方式
- import X:匯入模組X,並在當前名稱空間(namesapce)建立該模組的引用。可以使用:X.name引用定義在模組X中的屬性。
- from X import * :匯入模組X,並在當前名稱空間,建立該模組中所有公共物件(名字不以__開頭)的引用。即你能使用普通名字(直接是name)去引用模組X中的屬性,但是X本身沒有定義,不能使用X.name。並且如果名稱空間中原來有同名的name定義時,它將會被新的name取代。
- from X import a, b, c:匯入模組X,並在當前名稱空間建立該模組給定物件的引用。
- X = __import__('X'):類似(1)import X,區別在於:該方式顯示指定了X為當前名稱空間中的變數。使用方法一致。
2、當 import a module時,Python都做了哪些事情?
import a moudle時,首先,Python直譯器會檢查module registry(sys.moudles)部分,檢視是否該模組先前就已經匯入,如果sys.modules 中已經存在(即已註冊),則使用當前存在的模組物件即可。如果 sys.modules 中還不存在,則:
(1)建立一個新的、空的module物件(本質上是一個字典);
(2)在sys.modules字典中插入該模組物件;
(3)載入該模組程式碼所對應的物件(如果需要,可以先編譯好(編成位碼))。
然後在新的模組名稱空間、執行該模組程式碼物件(code object)。所有由該程式碼指定的變數均可以通過該模組物件引用。
注:上述步驟只有在模組第一次執行時才會執行。在這之後,匯入相同模組時,會跳過這些步驟,而只提取記憶體中已載入的模組物件。這是個有意設計的結果。因為匯入(找檔案--將其編譯成位元組碼--執行程式碼)是一個開銷很大的操作以至於每個程式執行不能夠重複多於一次。若想要Python 在同一次會話中再次執行檔案(不停止和重新啟動會話),需要呼叫內建的reload(過載)函式(該函式返回值為一個Python模組物件)。
3、import 搜尋路徑順序
(1)程式的主目錄:即程式(頂層)檔案所在的目錄(有時候不同於當前工作目錄(指啟動程式所在目錄))。
(2)PYTHONPATH (環境變數)目錄
(3)標準連結庫目錄
(4)任何 .pth 檔案的內容(如果存在的話):安裝目錄下找到該檔案,以行的形式加入所需要的目錄即可。
以上四個元件組合起來就變成了 sys.path,其儲存了模組搜尋路徑在機器上的實際配置,可以通過列印內建的sys.path 列表來檢視這些路徑。匯入時,Python會由左至右搜尋列表中的每個目錄,知道找到對應的module為止。
其中搜索路徑的(1)和(3)是系統自動定義的,而(2)(4)可以用於拓展路徑,從而加入自己的原始碼目錄。
另外:也可以使用sys.path在Python程式執行時臨時修改模組搜尋路徑。
如:
import sys
sys.path.append('C:\\mydir')
注意:以上sys.path的設定方法只是在程式執行時臨時生效的,一旦程式結束,不會被保留下來。而前面介紹的四種路徑配置方式則會在作業系統中永久儲存下來。
References:
1、《Python 學習手冊》第3章、第18章以及第19章