python-模組和包
模組:
1. 一個py檔案,就是一個模組,檔案中包括定義的函式和類等資訊。
2. 儘管可以import多次,實際上模組只匯入一次
3. 模組搜尋路徑 記憶體中已經載入的模組->內建模組->sys.path路徑(導模組的環境變數)中包含的模組
4. 匯入模組
將整個模組匯入 import 模組名
匯入所有函式 from 模組名 import *
從模組中匯入某個函式 from 模組名稱 import 函式1(, 函式2...) 也可以是屬性
使用區別
import 模組名和form 模組名 import *,呼叫模組函式(屬性)時的格式是 模組.
from 模組名 import 函式名(屬性名),這可以直接使用,無需新增模組名
包:
假設目錄結構如圖:
1. 當一個目錄內含有__init__ . py檔案時,就可以視該目錄為一個包,因此圖中Model和 Basenodel logmodel都是包
2. 匯入包
(1)import 包名; import Model.Basemodel, importModel, import Basemodel;使用該模組下的方法時,需要將import之後名稱全部加上,方可呼叫成功。
該操作只能匯入該包下的模組,不能匯入子包中的模組;也不能通過通過包名.報名.模組.函式(變數)來訪問。
直接匯入Model,Model中包含包
提示屬性不存在,將Basemodel當作模組呼叫
(2)from 包名.[包名. ] import 模組名(模組名字之前不能有'包名.'): from Model.Basemodel import Image
(3)from 包名.[包名. ] import *
3. __init__檔案
(1) 該檔案,可以表示該目錄是一個包,內容可以為空,第一次匯入包或者是包的任何其他部分,實際就是匯入該檔案。因此,我們在該檔案中匯入需要的模組(別人在匯入包的同時,也就匯入__init__檔案中的模組),這樣在使用時,使用者感覺可以將這個包當作模組使用,而不關心其背部結構。
例如:Model包中的__init__檔案內容如下:
其他模組在匯入時,就可以簡單的使用,不用關心其內部結構(使得匯入包 嚮導入模組一樣簡單)
(2) 特殊變數 __all__
__init__不僅僅用來匯入模組,其本身也可以加入程式碼,其中存在特殊變數__all__ ,該變數是一個列表,列表中以字串的格式存放變數或者函式,在執行 form 包 import * 時,匯入該列表內容。示例:
列表中添加了add函式和xx變數
其他模組執行 from Model import *,
執行結果:
提示mul函式未定義,因為該函式不在__all__列表中
4.相對路徑匯入
在此目錄結構中,__init__ 和 Basemodel 在同一目錄下,因此在__init__檔案中想要匯入BaseModel檔案,可以使用相對路徑,也就是使用linux系統中的 .(本目錄) 和..(上級目錄),並且只能在一個目錄中使用,不能用於不同目錄內
此截圖,使用的就是'.',意思是同級目錄下的Basemodel包,而不會去尋找其他包。