日期:2020年2月16日
作者:Commas
註釋:學習就是爲了忘記,接上一章《Python3之面向對象小結》,現在講一下單例;
如果您想了解更多有關Python的知識,那麼請點《我的Python淺談系列目錄》
一、模塊的概念與開發原則
模塊
就是一個工具包,這個工具包(模塊
)對外提供全局變量、函數、類
三種類型的工具,工具包名稱(模塊名
)實則是一個標識符
,需要滿足標識符命名規範(此知識不再贅述,想了解請看我的另一篇博客《Python3之命名規範淺談》),而模塊的本質
就是以.py
爲擴展名的源代碼文件。
模塊的開發原則也很簡單,就是每一個文件應該是可以被導入的,我們可以理解爲:
- 模塊中所有沒有任何縮進的代碼都應該被執行一遍,加載到內存,以供調用者使用;
- 模塊中的測試代碼應該保證僅在其內部使用,而被導入到其他文件中應該不被執行;
這麼一看,那麼問題來了,我們該如何讓測試代碼滿足以上的執行條件呢?接下來我們需要學習一下python中的一個內置屬性__name_,此屬性記錄着一個字符串,詳情如下表:
分情況討論 | __name__值 |
---|---|
模塊爲當前執行程序時 | ‘_ main _’ (雙下劃線字符串) |
模塊被其他文件導入時 | 被導入模塊名 |
由此,我們可以好好使用這個屬性,將我們的測試代碼放入其中,如下:
if __name__ = "__main__":
# 此處寫測試代碼
pass
這樣,我們的測試代碼僅在模塊爲當前執行程序時,被導入將不再執行,大功告成!最後,給出推薦的模塊代碼格式,如下:
# 導入模塊
# 定義全局變量
# 定義類
# 定義函數
def main():
"""
此處爲測試代碼,是否已解惑各位同學們心中那些年的疑惑呀?
"""
pass
if __name__ = "__main__":
"""
僅在模塊爲當前執行程序時,執行main();
被其他文件導入時,將不再執行main()
"""
main()
二、模塊的導入與命名空間的關係
學習了模塊的概念以及如何開發一個標準的模塊後,不由自主地思考着,模塊既然是工具,那麼該如何導入以及使用,總共有幾種導入的方法呢?那麼繼續看下文:
- import導入
# 【導入模塊】:在導入模塊時,每個導入過程應該獨佔一行
# (1)直接導入
import 模塊名1
import 模塊名2
# (2)模塊名取別名,as後面接“模塊別名”
import 模塊名3 as 模3
# 【使用工具】:模塊的調用
# 全局變量(或 方法名)相同,但是不衝突,原因是命名空間將其變量隔離
# 三個模塊,對應三個不同的命名空間
模塊名1.變量名1
模塊名2.變量名1
模3.變量名1
模塊名1.方法名1()
模塊名2.方法名1()
模3.方法名1()
- from … import …
# 【導入工具】:從模塊導入某一個工具
# (1)直接導入
from 模塊名1 import 工具名1
from 模塊名1 import 工具名2
# (2)工具名取別名,as後面接“工具名別名”
from 模塊名2 import 工具名2 as 模2工2
# 【使用工具】:工具的調用
# 爲什麼“模塊名2”中的工具名2要取別名?
# 因爲“模塊名1”中的工具名2會被“模塊名2”的工具名2覆蓋
# 爲什麼變量會被覆蓋?
# 因爲這些變量都在同一個命名空間(即當前執行程序的模塊)中
工具名1()
工具名2()
模2工2()
另外一個導入模式瞭解就好,因爲不好排查變量覆蓋問題,如下:
# 從“模塊名1”中導入所有的工具(全局變量、函數、類)
from 模塊名1 import *
三、模塊的搜索順序
- 搜索
當前目錄
,若模塊名存在,則直接導入,否則繼續搜索; - 搜索
系統目錄
,若模塊名存在,則直接導入,否則調用模塊中的方法時,將會拋出異常;
每一個模塊中都有一個內置屬性__file__屬性,可以查詢當前模塊所在的路徑,示例如下:
import http
print(http.__file__)
# 控制檯輸出:
D:\Python\Python37\lib\http\__init__.py
版權聲明:本文爲博主原創文章,如需轉載,請給出:
原文鏈接:https://blog.csdn.net/qq_35844043/article/details/104339709