一、什麼是模塊
模塊就是一系列功能的集合體。在Python中,一個py文件就是一個模塊,比如module.py就是一個模塊,其中模塊名是module。
模塊的四種存在方式(通用類別):
- 使用python編寫的.py文件(任何一個py文件都可以作爲模塊)
- 把一系列功能屬性相近的模塊組織到一起的文件夾(包)
- 使用C編寫並鏈接到python解釋器的內置模塊
- 已被編譯爲共享庫或DLL的C或C++擴展
二、爲何使用模塊?
- 從文件級別組織代碼,是同特性的功能能統一管理
- 可以使用系統或第三方模塊(拿來主義),來提高開發效率
三、使用模塊
(一)import 導入模塊
import 模塊名
1.首次導入模塊發生的三件事
①創建一個模塊的名稱空間
②執行模塊對應文件,將產生的名字存放於①中的名稱空間。
③在當前執行文件中,拿到一個模塊名,該模塊指向①的名稱空間
強調:
每一個文件都會產生自己的全局名稱空間,且相互不影響,模塊中功能的執行始終以模塊自己的命名空間爲準。
多次導入,只會編譯執行模塊一次,將其加載到內存,之後的都是直接對名字的引用。
模塊名.模塊內定義的名字——引用功能
2.起別名
通過as關鍵字可以給模塊起別名: 模塊名一旦起別名,原模塊名就不能再使用
3.優點
1.將複雜冗長的模塊名簡明化
import my_name_is_long as mg
print(mg.num)
2.可以統一功能
engine = input('數據庫選擇 1:mysql 2:oracle:')
if cmd == '1':
import mysql as db
else:
import oracle as db
db.功能() # 不需動這塊
4.一行導入多個模塊(不推薦使用)
import 模塊名1,模塊名2,……,模塊名n
推薦寫成多行。
(二)from導入模塊
from 模塊名 import 對象
可以指名道姓導入模板中所有想導入的名字
1.首次導入模塊的三件事
①創建一個模塊的名稱空間
②執行模塊對應文件,將產生的名字存放於①中的名稱空間。
③在①名稱空間中直接拿到模塊中的名字,可以直接使用,不加任何前綴。
強調
執行模塊中的功能,始終以模塊的名稱空間爲準。
from……import 名字,拿到的名字可以不加前綴直接使用,使用方便,但問題是容易與當前執行文件相同的名字衝突。
2.起別名
from 模塊名 import 原名 as 新名
3.在一行中導入多個
from 模塊名 import 名,名,……,名
4.from 模塊名 import *
導入模塊中的所有名字,默認不會導入_開頭的名字
配合__all__ = ['名字1','名字2',……'名字n']
,此時 * 只會導入列表中的名字(包括_開頭的名字)
不建議直接導入 * ,因爲可讀性差,且極容易出現變量重名
四、區分Python文件的兩種用途
print( __name__)
name__的值
①在文件被直接執行的情況下,等於__main
②在文件被導入的情況下,等於模塊名。
if __name__ == '__main__'
測試代碼塊
五、模塊的搜索路徑
內存中已經加載的模塊—》內置模塊—》sys.path路徑中包含的模塊。 sys.path的第一個值是當前執行文件所在的文件夾。
import sys
sys.path.append(r'路徑') # 在最後添加
sys.path.insert(index,r'路徑') # 指定位置插入
六、模塊導入的執行流程
導入模塊的指令:
1.相對於 函數名() 調用函數體,函數調用會進入函數體,從上至下逐句解釋執行函數體代碼
2.導入模塊,會進入模塊文件,從上至下逐句解釋執行模塊文件代碼
3.如果在模塊中又遇到導入其他模塊,會接着進入導入的模塊,從上至下逐句解釋執行文件中代碼,依次類推
這會導致下面循環導入這個問題
循環導入
模塊之間出現了環狀導入,如:m1.py 中導入了m2,m2.py 中又導入了m1
導入模塊是要使用模塊中的變量 ,正常邏輯都是在文件最上方先完成對模塊的導入,再在下方定義自身模塊變量,以及使用導入的模塊中的變量 ,由於導入模塊的特殊機制,第一次導入模塊會編譯執行導入的模塊,也就是會進入模塊逐句執行模塊內容,再次導入只是使用內存中的名字,就會出現下面的情況,m2在使用m1中的變量x,但變量x卻並未產生,這就出現了循環導入問題。
m1.py文件
import m2
x = 10
print(m2.y)
m2.py文件
import m1
y = 10
print(m2.x)
解決方法:延後導入
1、將循環導入對應包要使用的變量提前定義,再導入響應的包
2、將導包的路徑放到函數體中,保證存放導包邏輯的函數調用在要使用的變量定義之後
重點:
問題:from導包極容易出現循環導入問題
解決:建議from導入方式改用import導入方式