Python的學習之旅———模組與包的使用 常用模組
一:import
匯入模組,只會在第一次匯入時執行原始檔的程式碼
如果模組已經載入到記憶體了,下一次匯入直接引用記憶體中匯入的結果
eval:提取字串內的表示式執行,然後返回執行結果
import 匯入檔案都做了哪些事?
1 以原始檔為準產生一個名稱空間
2 以剛剛產生的名稱空間為準,執行原始檔的程式碼
3 會在當前檔案中定義一個名字,這個名字就是模組名,用來引用模組中的名字
為模組起別名
import spam as sm
1 engine_type='mysql' 2 if engine_type == 'mysql': 3 import mysql as engine 4 elif engine_type == 'oracle': 5 import oracle as engine 6 engine.parse()
可以把兩個不同的模組引入時候起相同的別名 ,做到呼叫的時候統一化。小技巧
在一行匯入多個模組
1 import sys,os,re
二 使用模組之from ... import...
from spam import read1,read2,moeny
直接匯入了spam中的 函式 read1 和read2 的名字 也可以匯入變數名字 money
這樣使用的時候就不用以spam.read1()的方式呼叫函數了.
from spam import *
一下把spam.py中的所有名字都引入了
如果引入的模組中有__all__=['字串函式名','字串變數名']那麼
from spam import * 中* 對應模組spam內的__all__列表內的名字。
三模組的過載
考慮到效能的原因,每個模組只被匯入一次,放入字典sys.module中,如果你改變了模組的內容,你必須重啟程式,python不支援重新載入或解除安裝之前匯入的模組,
有的同學可能會想到直接從sys.module中刪除一個模組不就可以解除安裝了嗎,注意了,你刪了sys.module中的模組物件仍然可能被其他程式的元件所引用,因而不會被清楚。
特別的對於我們引用了這個模組中的一個類,用這個類產生了很多物件,因而這些物件都有關於這個模組的引用。
如果只是你想互動測試的一個模組,使用 importlib.reload(), e.g. import importlib; importlib.reload(modulename),這隻能用於測試環境。
四py檔案模組與指令碼的區別
1 編寫好的一個python檔案可以有兩種用途: 2 一:指令碼,一個檔案就是整個程式,用來被執行 3 二:模組,檔案中存放著一堆功能,用來被匯入使用 4 5 6 python為我們內建了全域性變數__name__, 7 當檔案被當做指令碼執行時:__name__ 等於'__main__' 8 當檔案被當做模組匯入時:__name__等於模組名 9 10 作用:用來控制.py檔案在不同的應用場景下執行不同的邏輯 11 if __name__ == '__main__':
__name__的判斷要在寫在模組(指令碼程式中)
檔案spam.py當做指令碼執行,該值等於__main__,檔案spam.py當做模組被匯入時,該值等於指令碼名(spam)
五 模組的搜尋路徑
模組的查詢順序是:記憶體中已經載入的模組->內建模組(系統內建那些)->sys.path路徑中包含的模組
1 import sys 2 sys.path.append(r'檔案路徑\a') a是資料夾 3 import m 4 也可以先去找到a 然後順著a找到m(a和執行檔案是在同一個目錄下) 5 from a import m
把檔案的路徑加入系統環境變數中,這是加入一次,而不是永久寫入。
六 包介紹
1包是一種通過使用‘.模組名’來組織python模組名稱空間的方式
具體的:包就是一個包含有__init__.py檔案的資料夾,所以其實我們建立包的目的就是為了用資料夾將檔案/模組組織起來 #需要強調的是: 1. 在python3中,即使包下沒有__init__.py檔案,import 包仍然不會報錯,而在python2中,包下一定要有該檔案,否則import 包報錯 2. 建立包的目的不是為了執行,而是被匯入使用,記住,包只是模組的一種形式而已,包的本質就是一種模組
2需要注意的是
#1.關於包相關的匯入語句也分為import和from ... import ...兩種, 但是無論哪種,無論在什麼位置,在匯入時都必須遵循一個原則: 凡是在匯入時帶點的,點的左邊都必須是一個包(也就是說資料夾下必須有__init__.py這個檔案),否則非法。 可以帶有一連串的點,如item.subitem.subsubitem, 但都必須遵循這個原則。但對於匯入後,在使用時就沒有這種限制了, 點的左邊可以是包,模組,函式,類(它們都可以用點的方式呼叫自己的屬性)。 #2、import匯入檔案時,產生名稱空間中的名字來源於檔案,import 包,產生的名稱空間的名字同樣來源於檔案,即包下的__init__.py,匯入包本質就是在匯入該檔案 #3、包A和包B下有同名模組也不會衝突,如A.a與B.a來自倆個名稱空間
包的標誌就是包含__init__.py這個檔案。
圖列:
模組匯入的時候都會做三件事
1 以原始檔為準產生一個名稱空間 2 以剛剛產生的名稱空間為準,執行原始檔的程式碼 3 會在當前檔案中定義一個名字,這個名字就是模組名,用來引用模組中的名字
總結
1 import包的時候 建議使用 from ...import的形式。這樣就不用sys.path.append(r'包的路徑') 2 3 from可以用來指定路徑 import決定需要獲取的名稱空間 4 5 執行檔案和包在同一資料夾下的時候 可以直接import 6 7 執行檔案和包不在同一資料夾下的時候c:\a\b\c\d\ 執行檔案在a下 包在d下 那麼就需要在執行檔案中首先匯入sys.path.append(r'c:\a\b\c\d') 包以及包所包含的模組都是用來被匯入的,而不是被直接執行的。而環境變數都是以執行檔案為準的
執行檔案呼叫包內名稱的方式決定了from 路徑結構
第一種
1 執行檔案中 2 import a 3 a.f1() 4 a.f2() 5 a.f3() 6 a包 __init__中的程式碼 7 from .am1 import f1 #等同於絕對路徑from a.am1 import f1
8 from .am2 import f2 9 from .b.bm1 import f3
第二種
執行檔案中 import a.b.bm1 a.b.bm1.f3() a包 __init__中沒有程式碼
第三種
1 執行檔案中 2 from a.b.bm1 import f3 3 f3() 4 a包 __init__中沒有程式碼
第一種依賴包中__init__ ,第二種是不依賴__init__.