Python3之模塊淺談

日期:2020年2月16日
作者:Commas
註釋:學習就是爲了忘記,接上一章《Python3之面向對象小結》,現在講一下單例;
如果您想了解更多有關Python的知識,那麼請點《我的Python淺談系列目錄》



一、模塊的概念與開發原則

模塊就是一個工具包,這個工具包(模塊)對外提供全局變量、函數、類三種類型的工具,工具包名稱(模塊名)實則是一個標識符,需要滿足標識符命名規範(此知識不再贅述,想了解請看我的另一篇博客《Python3之命名規範淺談》),而模塊的本質就是以.py爲擴展名的源代碼文件。
模塊的開發原則也很簡單,就是每一個文件應該是可以被導入的,我們可以理解爲:

  1. 模塊中所有沒有任何縮進的代碼都應該被執行一遍,加載到內存,以供調用者使用;
  2. 模塊中的測試代碼應該保證僅在其內部使用,而被導入到其他文件中應該不被執行;
    這麼一看,那麼問題來了,我們該如何讓測試代碼滿足以上的執行條件呢?接下來我們需要學習一下python中的一個內置屬性__name_,此屬性記錄着一個字符串,詳情如下表:
分情況討論 __name__值
模塊爲當前執行程序時 ‘_ main _’(雙下劃線字符串)
模塊被其他文件導入時 被導入模塊名

由此,我們可以好好使用這個屬性,將我們的測試代碼放入其中,如下:

if __name__ = "__main__":
	# 此處寫測試代碼
	pass

這樣,我們的測試代碼僅在模塊爲當前執行程序時,被導入將不再執行,大功告成!最後,給出推薦的模塊代碼格式,如下:

# 導入模塊
# 定義全局變量
# 定義類
# 定義函數

def main():
	"""
	此處爲測試代碼,是否已解惑各位同學們心中那些年的疑惑呀?
	"""
	pass
	
if __name__ = "__main__":
	"""
	僅在模塊爲當前執行程序時,執行main();
	被其他文件導入時,將不再執行main()
	"""
	main()

二、模塊的導入與命名空間的關係

學習了模塊的概念以及如何開發一個標準的模塊後,不由自主地思考着,模塊既然是工具,那麼該如何導入以及使用,總共有幾種導入的方法呢?那麼繼續看下文:

  1. import導入
# 【導入模塊】:在導入模塊時,每個導入過程應該獨佔一行
# (1)直接導入
import 模塊名1
import 模塊名2
# (2)模塊名取別名,as後面接“模塊別名”
import 模塊名3 as3

# 【使用工具】:模塊的調用
# 全局變量(或 方法名)相同,但是不衝突,原因是命名空間將其變量隔離
# 三個模塊,對應三個不同的命名空間
模塊名1.變量名1
模塊名2.變量名13.變量名1

模塊名1.方法名1()
模塊名2.方法名1()3.方法名1()
  1. from … import …
# 【導入工具】:從模塊導入某一個工具
# (1)直接導入
from 模塊名1 import 工具名1
from 模塊名1 import 工具名2
# (2)工具名取別名,as後面接“工具名別名”
from 模塊名2 import 工具名2 as22

# 【使用工具】:工具的調用
# 爲什麼“模塊名2”中的工具名2要取別名?
# 因爲“模塊名1”中的工具名2會被“模塊名2”的工具名2覆蓋
# 爲什麼變量會被覆蓋?
# 因爲這些變量都在同一個命名空間(即當前執行程序的模塊)中
工具名1()
工具名2()22()

另外一個導入模式瞭解就好,因爲不好排查變量覆蓋問題,如下:

# 從“模塊名1”中導入所有的工具(全局變量、函數、類)
from 模塊名1 import *

三、模塊的搜索順序

  1. 搜索當前目錄,若模塊名存在,則直接導入,否則繼續搜索;
  2. 搜索系統目錄,若模塊名存在,則直接導入,否則調用模塊中的方法時,將會拋出異常;

在這裏插入圖片描述
每一個模塊中都有一個內置屬性__file__屬性,可以查詢當前模塊所在的路徑,示例如下:

import http
print(http.__file__)
# 控制檯輸出:
D:\Python\Python37\lib\http\__init__.py

版權聲明:本文爲博主原創文章,如需轉載,請給出:
原文鏈接:https://blog.csdn.net/qq_35844043/article/details/104339709

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章