1. 程式人生 > >Python基礎之(模組與包)

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為起始點,匯入麻煩

# 相對匯入: 參照當前所在檔案的資料夾為起始開始查詢,稱之為相對匯入
#        符號: .代表當前所在檔案的資料夾,..代表上一級資料夾,...代表上一級的上一級資料夾
#        優點: 匯入更加簡單
#        缺點: 只能在匯入包中的模組時才能使用
#注意:
#相對匯入只能用於包內部模組之間的相互匯入,匯入者與被匯入者都必須存在於一個包內

#試圖在頂級包之外使用相對匯入是錯誤的,言外之意,必須在頂級包內使用相對匯入,每增加一個.代表跳到上一級資料夾,而上一級不應該超出頂級包