前言
在python的模塊有兩種組織方式,一種是單純的python文件,文件名就是模塊名,一種是包,包是一個包含了若干python文件的目錄,目錄下必須有一個文件__init__.py
,這樣目錄名字就是模塊名,包里的python文件也可以通過包名.文件名的方式import
import語法
import語法有兩種
1、直接import模塊
import Module import Module as xx
2、從模塊import對象(下級模塊,類,函數(shù),變量等)
from Module import Name from Module immport Name as yy
as語法是用來設(shè)置對象(這里用對象泛指模塊,類,函數(shù)等等)別名,import將對象名字引入了當(dāng)前文件的名字空間
假設(shè)有如下目錄結(jié)構(gòu)
├── A.py└── pkg ├── B.py └── __init__.py
在當(dāng)前目錄下,以下語句都是有效的
import A import pkgimport pkg.Bfrom pkg import B
為了簡化討論,下面將不會對as語法進(jìn)行舉例
import步驟
python所有加載的模塊信息都存放在sys.modules結(jié)構(gòu)中,當(dāng)import一個模塊時,會按如下步驟來進(jìn)行
sys.modules
中是否已經(jīng)有A,如果有則不加載,如果沒有則為A創(chuàng)建module對象,并加載A 如果是from A import B,先為A創(chuàng)建module對象,再解析A,從中尋找B并填充到A的__dict__
中嵌套import
在import模塊時我們可能會擔(dān)心一個模塊會不會被import多次,假設(shè)有A,B,C三個模塊,A需要import B和C,B又要import C,這樣A會執(zhí)行到兩次import C,一次是自己本身import,一次是在import B時執(zhí)行的import,但根據(jù)上面講到的import步驟,在第二次import時發(fā)現(xiàn)模塊已經(jīng)被加載,所以不會重復(fù)import
但如下情況卻會報錯
#filename: A.pyfrom B import BBclass AA:pass#filename: B.pyfrom A import AAclass BB:pass
這時不管是執(zhí)行A.py還是B.py都會拋出ImportError的異常,假設(shè)我們執(zhí)行的是A.py,究其原因如下
from A import AA
,此時又會去掃描A.py 掃描A.py第一行執(zhí)行from B import BB
,由于步驟1已經(jīng)為B創(chuàng)建module對象,所以會直接從B的module對象的__dict__
中獲取BB,此時顯然BB是獲取不到的,于是拋出異常解決這種情況有兩種辦法,
總之,import需要注意的是,盡量在需要用到時再import
包的import
當(dāng)一個目錄下有
新聞熱點
疑難解答
圖片精選