目錄
1:模塊介紹
在Python中,每一個文件都是一個模塊,模塊是最高級別的程序組織單元,它將程序代碼和數據封裝起來以便再次利用,同時提供自包含的命名空間以便避免程序出現變量名衝突。模塊在導入其他模塊之後就可以使用被導入模塊中定義的名稱。
2:模塊的導入方式及過程
2.1:import,from xx import yy
import:把一個模塊整體導入:
import random
print(random.randint(1,20))
# 也可以取別名
# import random as aaa
# print(aaa.randint(1,20))
from :從一個模塊中獲得特定的名稱
# 導入模塊中的多個個屬性,方法等,
from random import randint,randrange
print(randint(1,20))
#也可以取別名
# from random import randint as aaa
# print(aaa(1,20))
2.2:imp.reload 動態導入
在不終止Python程序的情況下,重新載入模塊文件代碼的方法。
2.3:模塊導入過程
import和from都是隱式的賦值語句:
import將整個模塊對象賦值給一個單獨的名稱。
from將一個或多個名稱賦值給另一個模塊中的同名對象。
每個進程中的單個模塊(文件)只做一次導入:模塊在第一次import或from時被載入並執行,在第二次及以後的導入時不會加載及運行,但會進行賦值操作。模塊在每次導入時會先去sys.modules中查找被導入的模塊是否存在於sys.modules中,如果存在說明已經導入過,不會做加載及運行操作,如果不存在,則對導入的模塊進行加載,並創建模塊中的對象,運行模塊中的調用的方法,完了之後把模塊信息寫入sys.modules中。因此模塊中的變量是全局的,可以在不同的模塊中進行共享,不會在每次導入中創建一個副本。
下面來驗證下:
fileA.py
lst = [1,2,3,4]
print("in fileA.py")
fileB.py :導入模塊fileA
import fileA
fileA.lst.append("fileB")
print("in fileB.py")
fileC.py :導入模塊fileA
import fileA
fileA.lst.append("fileC")
print("in fileC.py")
test.py
print('--0001--')
from xmodule import fileB
print('--0002--')
from xmodule import fileC
print('--0003--')
import fileA
print('--0004--')
print(fileA.lst)
print('--0005--')
import imp
imp.reload(fileA)
print('--0006--')
print(fileA.lst)
print('--0007--')
/*
# 輸出結果:
--0001-- # 導入模塊B,模塊B中又導入模塊A,模塊A是本進程中第一次導入,故輸出如下:
in fileA.py
in fileB.py
--0002-- # 導入模塊C,模塊C中又導入模塊A,但模塊A已被導入,故輸出如下:
in fileC.py
--0003-- # 導入模塊A,但模塊A已被導入,故沒有輸出;還是會給fileA賦值,
--0004-- # 打印 fileA.lst
[1, 2, 3, 4, 'fileB', 'fileC']
--0005-- # imp.reload(fileA) 重新加載模塊fileA,lst被重新賦值
in fileA.py
--0006-- # 重新加載之後,lst被重新賦值
[1, 2, 3, 4]
--0007--
*/
3:Python中的包
Python代碼的目錄被稱爲包,除模塊名之外,導入還可以指定目錄路徑,因此這樣的導入就稱之爲包導入。
導入格式:
import dir1.dir2.mod1
from dir1.dir2.mod1 import a
其中目錄dir1,dir2下需要有__init__.py文件