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