Python之包的相關
阿新 • • 發佈:2020-08-10
包的產生:
- 由於模組不斷更新,越寫越大,僅用單個py檔案會使模組邏輯不夠清晰,所以需要將模組的不同功能放入不同的py檔案,然後將所有py檔案放在一個目錄內,這個目錄就是包
- 包就是一個包含用__init__.py檔案的目錄
包的使用:
- 包的本質是模組的一種形式,包是用來被當做模組匯入,而不是用來直接執行
- 匯入包本質是匯入包內的__init__.py檔案
import package
# Python2匯入包,若包裡沒有__init__.py檔案會報錯
# Python3匯入包,若包裡沒有__init__.py檔案不會報錯
包的匯入:
- 首先有如下檔案結構
''' test_dir/ -pkg1 -__init__.py -p1_m1.py -f1() -p1_m2.py -f2() -pkg2 -__init__.py -p2_m1.py -f3() -p2_m2.py -f4() -demo.py '''
-
在demo.py內使用函式f1
-
方式一:
import pkg1.p1_m1
pkg1.p1_m1.f1()
# 使用過於囉嗦,可以起別名
import pkg1.p1_m1 as m1
m1.f1()
- 方式二:
# 直接從包內匯入檔案
from pkg1 import p1_m1
p1_m1.f1()
# 也可直接匯入f1
from pkg1.p1_m1 import f1
f1()
注:對使用者來說,包的匯入和單個模組的匯入應該方式相同,若使用者匯入包失敗,應考慮包是否在sys.path列表中。
-
from ...impot 的from 後面可以帶多個點. 點的左側只能是包的名字。
-
from...import 的import後面只能接py檔案或檔案內的方法
不能帶點.
from pkg1 import p1_m1.f1
p1_m1.f1()
# 語法錯誤
若要讓使用者對包的匯入不會發生變化(當作單個模組匯入),需要在包內的__init__.py檔案內匯入其他的模組
-
絕對匯入:
-
以包作為頂級目錄來匯入
# pkg1/__init__.py檔案內 from pkg1.p1_m1 import f1 from pkg1.p1_m2 import f2 from pkg2.p2_m1 import f3
-
點的左側必須是包
-
-
相對匯入
- 僅限於包內使用,不能跨出包
- . :表示當前目錄
- .. :表示上一級目錄
# pkg1/__init__.py檔案內
from .
注:包內之間的匯入推薦使用相對匯入
-
在__init.py__內使用from ... import ... 匯入包內的其他模組時,無法直接在init.py檔案內執行,只能被其他檔案用來匯入
-
在init.py檔案內不能使用import p1_m1匯入包內的其他檔案,這樣雖然可以直接在init.py檔案內執行匯入的模組,但當包被其他檔案匯入時,由於sys.path環境變數原因,包無法使用。