1. 程式人生 > 實用技巧 >Python之包的相關

Python之包的相關

包的產生:

  • 由於模組不斷更新,越寫越大,僅用單個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環境變數原因,包無法使用。