11.python開源——工程專案結構
工程專案結構需要先弄清三個概念:包、模組、類
模組對應的是一個.py 檔案,那麼module_name 就是這個檔案去掉.py 之後的檔名,py 檔案中可以直接定義一些變數、函式、類。
匯入模組
import module_name
from package_name import module_name
from package_name import *
那麼如何import 時,python 直譯器如何才能找到該模組放置的檔案位置呢?python 尋找模組的優先順序如下:
1、 當前檔案目錄
2、 環境變數PYTHONPATH
3、 sys.path(list 型別)
模組在被匯入執行時,python直譯器為加快程式的啟動速度,會在與模組檔案同一目錄下生成.pyc檔案。我們知道python是解釋性的指令碼語言,而.pyc是經過編譯後的位元組碼,這一工作會自動完成,而無需程式設計師手動執行。
包
將某些功能相近的檔案組織在同一資料夾下,就需要運用包的概念。包對應於資料夾,使用包的方式跟模組也類似,唯一需要注意的是,當資料夾當作包使用時,資料夾需要包含__init__.py檔案,主要是為了避免將資料夾名當作普通的字串。__init__.py的內容可以為空,一般用來進行包的某些初始化工作或者設定__all__值,__all__是在from package-name import *這語句使用的,全部匯出定義過的模組。
Python使用縮排對齊組織程式碼的執行,所有沒有縮排的程式碼(非函式定義和類定義),都會在載入時自動執行,這些程式碼,可以認為是Python的main函式。
每個檔案(模組)都可以任意寫一些沒有縮排的程式碼,並且在載入時自動執行,為了區分主執行檔案還是被呼叫的檔案,Python引入了一個變數__name__,當檔案是被呼叫時,__name__的值為模組名,當檔案被執行時,__name__為'__main__'。這個特性,為測試驅動開發提供了支援,可以在每個模組中寫上測試程式碼,這些測試程式碼僅當模組被Python直接執行時才會執行,程式碼和測試完美的結合在一起。
__init__.py
__init__.py可以為空,只要它存在,就表明此目錄應被作為一個package處理。當然,__init__.py中也可以設定相應的內容。
__init__ 方法通常用在初始化一個類例項的時候
__all__
在模組(*.py)中使用匯出__all__列表裡的類、函式、變數等成員,否則將匯出所有不以下劃線開頭(私有)的成員,在模組中使用__all__屬性可避免在相互引用時的命名衝突
__path__變數
__path__指定了包的搜尋路徑
__new__
__new__方法接受的引數雖然也是和__init__一樣,但__init__是在類例項建立之後呼叫,而 __new__方法正是建立這個類例項的方法
依照Python官方文件的說法,__new__方法主要是當你繼承一些不可變的class時(比如int, str, tuple), 提供給你一個自定義這些類的例項化過程的途徑。還有就是實現自定義的metaclass。