Python基礎之(模組與包)
一、什麼是模組
模組就是一組功能的集合體,我們的程式可以匯入模組來複用模組的功能
在python中,模組的使用方式都是一樣的,但其實細說的話,模組可以分為四個通用類別:
- 使用python編寫的程式碼(.py檔案)
- 已被編譯為共享庫或DLL的C或C++擴充套件
- 包好一組模組的包
- 使用C編寫並連結到python直譯器的內建模組
二、為什麼使用模組
2.1、從檔案級別組織程式,更方便管理。隨著程式的發展,功能越來越多,為了方便管理,我們通常將程式分成一個個的檔案,這樣做程式的結構更清晰,方便管理。這時我們不僅僅可以把這些檔案當做指令碼去執行,還可以把他們當做模組來匯入到其他的模組中,實現了功能的重複利用
2.2、拿來主義,提升開發效率。同樣的原理,我們也可以下載別人寫好的模組然後匯入到自己的專案中使用,這種拿來主義,可以極大地提升我們的開發效率
三、模組使用之import
3.1、使用import匯入
模組可以包含可執行的語句和函式的定義,這些語句的目的是初始化模組,它們只在模組名第一次遇到匯入import語句時才執行
import語句是可以在程式中的任意位置使用的,且針對同一個模組為了防止你重複匯入,python的優化手段是:第一次匯入後就將模組名載入到記憶體了,後續的import語句僅是對已經載入到記憶體中的模組物件增加了一次引用,不會重新執行模組內的語句
import test import test #執行,只是沒有顯示效果 #執行結果 form the test
3.2、第一次匯入模組做的三件事
- 為原始檔(test模組)建立新的名稱空間
- 在新建立的名稱空間中執行模組中包含的所有程式碼
- 建立名字test來引用該名稱空間
3.3、為模組起別名
import test as ts #可以將過長的模組命名改成短的,便於操作 #有利於程式碼的拓展,優化。
3.5、匯入多個模組
import sys,os,json # 可以這樣寫,但是不推薦 #推薦應該這樣: import sys import os import json
3.6、from .... import ....
from test import t1 from test import t1 as t #支援as from test import t1,t2,te #支援匯入多個 #與import區別 使用from...import...則是將模組中的名字直接匯入到當前的名稱空間中,所以在當前名稱空間中,直接使用名字就可以了、無需加字首 #from...import...的方式有好處也有壞處:好處:使用起來方便了,壞處:容易與當前執行檔案中的名字衝
from ....import * 把模組中所有的不是以下劃線(_)開頭的名字都匯入到當前位置,大部分情況下我們的python程式不應該使用這種匯入方式,因為*你不知道你匯入什麼名字,很有可能會覆蓋掉你之前已經定義的名字。當然可以使用__all__來控制*
__all__=['name1','name2'] #這樣在另外一個檔案中用from name import *就這能匯入列表中規定的兩個名字
3.7、模組的搜尋路徑
模組的查詢順序是:記憶體中已經載入的模組->內建模組->sys.path路徑中包含的模組
(Python直譯器只認執行檔案的os.path,與同級目錄無關)
import os import sys dir=os.path.dirname(os.path.dirname(os.path.abspath(__file__)) #上級目錄 sys.path.append(dir) #增加sys.path路徑
四、py檔案的兩種功能
#編寫好的一個python檔案可以有兩種用途: 1、指令碼,一個檔案就是整個程式,用來被執行 2、模組,檔案中存放著一堆功能,用來被匯入使用 #python為我們內建了全域性變數__name__, 當檔案被當做指令碼執行時:__name__ 等於'__main__' 當檔案被當做模組匯入時:__name__等於模組名 #作用:用來控制.py檔案在不同的應用場景下執行不同的邏輯 if __name__ == '__main__':
五、包
5.1、包是什麼
包是一種通過使用‘.模組名’來組織python模組名稱空間的方式
具體的:包就是一個包含有__init__.py檔案的資料夾,所以其實我們建立包的目的就是為了用資料夾將檔案/模組組織起來
需要強調的是:
- 在python3中,即使包下沒有__init__.py檔案,import 包仍然不會報錯,而在python2中,包下一定要有該檔案,否則import 包報錯
- 建立包的目的不是為了執行,而是被匯入使用,記住,包只是模組的一種形式而已,包的本質就是一種模組
5.2、匯入使用注意事項
- 關於包相關的匯入語句也分為import和from ... import ...兩種,但是無論哪種,無論在什麼位置,在匯入時都必須遵循一個原則:凡是在匯入時帶點的,點的左邊都必須是一個包,否則非法。可以帶有一連串的點,如item.subitem.subsubitem,但都必須遵循這個原則。但對於匯入後,在使用時就沒有這種限制了,點的左邊可以是包,模組,函式,類(它們都可以用點的方式呼叫自己的屬性)。
- import匯入檔案時,產生名稱空間中的名字來源於檔案,import 包,產生的名稱空間的名字同樣來源於檔案,即包下的__init__.py,匯入包本質就是在匯入該檔案
- 包A和包B下有同名模組也不會衝突,如A.a與B.a來自倆個名稱空間
5.3、絕對匯入和相對匯入
我們的最頂級包是寫給別人用的,然後在包內部也會有彼此之間互相匯入的需求,這時候就有絕對匯入和相對匯入兩種方式:
絕對匯入:以包作為起始
相對匯入:用.或者..的方式最為起始(只能在一個包中使用,不能用於不同目錄內)
# 絕對匯入: 以執行檔案的sys.path為起始點開始匯入,稱之為絕對匯入 # 優點: 執行檔案與被匯入的模組中都可以使用 # 缺點: 所有匯入都是以sys.path為起始點,匯入麻煩 # 相對匯入: 參照當前所在檔案的資料夾為起始開始查詢,稱之為相對匯入 # 符號: .代表當前所在檔案的資料夾,..代表上一級資料夾,...代表上一級的上一級資料夾 # 優點: 匯入更加簡單 # 缺點: 只能在匯入包中的模組時才能使用 #注意: #相對匯入只能用於包內部模組之間的相互匯入,匯入者與被匯入者都必須存在於一個包內 #試圖在頂級包之外使用相對匯入是錯誤的,言外之意,必須在頂級包內使用相對匯入,每增加一個.代表跳到上一級資料夾,而上一級不應該超出頂級包