18. 模組

星光映梦發表於2024-10-18

一、什麼是模組

  模組化 指將一個完成的程式分解為一個一個小的模組。透過將模組組合,來搭建一個完整的程式。如果不採用模組化,那麼所有的程式碼將統一儲存到一個檔案中。採用模組化後,將程式分別編寫到多個檔案中。使用模組化後,我們可以把程式碼進行復用,這方面後序的開發和維護。

二、模組的建立

  在 Python 中一個 .py 結尾的檔案就是一個模組。要向建立一個模組,就需要建立一個 Python 檔案。模組名要符合識別符號的命名規範。

  建立一個 moudle.py 檔案,內容如下:

if __name__ == "__main__":
    print('當前模組被作為主模組執行了')

print(__name__,"模組模組被執行了")

# 在模組中定義的變數,在引入模組後,就可以直接使用了
a = 10

# 可以在模組中定義函式
def test():
    print("我是", __name__ , "模組中的test()方法")

# 可以定義類
class Person:
    def __init__(self):
        self.name = "Sakura"

噹噹前檔案被執行時,__name__ 等於 __main__,如果當前模組是被匯入的話,則 __name__ 等於模組的名稱;

三、模組的引入

3.1、使用import匯入模組

  我們可以透過 import 關鍵字引入多個模組,多個模組之間用逗號(,)分隔。import 語句可以在程式的任意位置呼叫,但是一般情況下,import 語句都會統一寫在程式的開頭。我們可以引入同一個模組多次,但是模組的例項只會建立一個。每一個模組內部都有一個 __name__ 屬性,透過這個屬性可以獲取模組的名字。

import 模組名1,模組名2,...

  其中,模組名就是 Python 檔案的名字,不要字尾名(.py)。在使用 import 語句匯入不同模組時,每執行一條 import 語句都會建立一個新的名稱空間(namespace),並且在該名稱空間中執行與 .py 相關的所有語句。在呼叫模組中的變數、函式和類名前加上 “模組名.”的字首。

  使用 import 語句首次匯入模組時,會產生該模組對應的名稱空間。然後會執行該模組,將該模組執行過程中生成的名字都會丟到這個名稱空間中。然後會在當前執行檔案中產生一個名字,該名字指向被匯入模組產生的名稱空間。之後的匯入,都是直接引用首次匯入產生的名稱空間,不會重複實現。

  建立 template.py 檔案,內容如下:

import moudle

# 一個程式中只會有一個主模組,主模組就是直接透過 Python 執行的模組。
print("主模組",__name__)
print(moudle)
print(moudle.__name__)

# 訪問模組中的屬性
print(moudle.a)

# 訪問模組中的方法
moudle.test()

# 使用模組中的類
p = moudle.Person()
print(p)
print(p.name)

  我們還可以透過 as 關鍵字為模組名指定別名。

import 模組名 as 別名
import moudle as test

print(test)
print(test.__name__)

名稱空間可以理解為記錄名字和物件之間對應關係的空間;

目前 Python 的名稱空間大部分都是透過字典(dict)來實現的,其中,key 是識別符號,value 是具體的物件;

3.2、使用from...import匯入模組

  如果每次匯入模組時都建立一個新的名稱空間,而是將具體的定義匯入到當前的名稱空間中,這時可以使用 from...import 語句。使用 from...import 語句後,不需要再新增字首,可以直接透過具體的變數、函式、類名等訪問。

from 模組名 import 變數

  使用 from ... import 匯入模組時,會產生該模組對應的名稱空間。然後會執行該模組,將該模組執行過程中生成的名字都會丟到這個名稱空間中。然後會在當前檔案的名稱空間拿到一個名字,該名字指向被匯入模組中的對應成員的記憶體地址。

  建立 routine.py 檔案,內容如下:

from moudle import Person,test

p = Person()
print(p)
print(p.name)

test()

  我們還可以透過如下方法引入模組中的所有內容:

from 模組名 import *

在透過 from 模組名 import * 匯入模組中的內容時,不會引入以下劃線開頭的變數。

  我們還可以為引入的變數使用別名:

from 模組名 import 變數 as 別名
from moudle import test as new_test

def test():
    print("我是主模組中的test()方法")

test()
new_test()

在使用 from...import 匯入模組中的定義時,需要保證所匯入的內容在當前的名稱空間是唯一的,否則將會出現衝突,後匯入的同名變數、函式或者類會覆蓋先匯入的;

3.3、模組的匯入規則

  在 Python 內部匯入模組時,必須要遵循它的匯入規則,必須去指定的目錄中去找 .py 檔案。我們可以透過 sys 模組中的 path 屬性來檢視指定的匯入目錄。

import sys

for item in sys.path:
    print(item)

  執行結果如下:

e:\Source\Software\Python                 # 當前檔案所在的目錄
D:\Pycharm\Python311\python311.zip        # Python直譯器的python311.zip壓縮包
D:\Pycharm\Python311\DLLs                 # Python直譯器的DLLs目錄
D:\Pycharm\Python311\Lib                  # Python直譯器的Lib目錄
D:\Pycharm\Python311                      # Python直譯器的根目錄
D:\Pycharm\Python311\Lib\site-packages    # Python直譯器的Lib目錄下的site-packages目錄,第三方模組的安裝目錄

在 Pycharm 中執行此程式碼時,會自動新增當前專案的目錄到 sys.path 中;

  匯入檔案時,都是根據 sys.path 中的目錄進行 .py 檔案的尋找。在匯入模組前,我們可以透過 append() 方法自己新增路徑。

import os
import sys

path = os.path.abspath(__file__)            # 獲取當前執行檔案的絕對路徑
parent_path = os.path.dirname(path)         # 獲取當前執行檔案所在的目錄
base_path = os.path.dirname(parent_path)    # 獲取當前執行檔案所在的目錄的上一級目錄

sys.path.append(parent_path)
sys.path.append(base_path)

for item in sys.path:
    print(item)

四、標準庫

  為了實現開箱即用的思想,Python 為我們提供了一個模組的標準庫。在這個標準庫中,有很多很強大的模組我們可以直接使用,並且這個標準庫會隨 Python 的安裝一同安裝。

  對於標準庫中的模組,我們可以直接使用 import 語句匯入到 Python 檔案中使用。

import 模組名

  Python 中提供了許多標準模組,我們可以在 Python 的幫助文件中檢視。具體的方法是:開啟 Python 的安裝目錄下的 Doc 下的 html 目錄,在該目錄中有一個名為 index.html 檔案即為 Python 的幫助文件。

幫助文件位置

網頁中模組的位置

模組

模組名 描述
sys 與 Python 直譯器一起環境相關的標準庫
time 提供與時間相關的各種函式的標準庫
os 提供了訪問作業系統服務功能的標準庫
calendar 提供了與日期相關的各種函式的標準庫
urllib 用來讀取來自網上(伺服器上)資料據的標準庫
json 用於使用 JSON 序列化和反序列化物件
re 用於在字串中執行正規表示式匹配和替換
math 提供算術運算函式的標準庫
decimal 用於進行精確控制運算精度、有效數位和四捨五入操作的十進位制運算
shutil 用於進行高階檔案操作,如複製、移動、重新命名等
logging 提供了靈活的記錄事件、錯誤、警告和除錯資訊等日誌資訊的功能
tkinter 使用 Python 進行 GUI 程式設計的標準庫
import sys
# pprint模組中的pprint()方法可以用來堆列印的資料做簡單的格式化
import pprint

# 獲取執行程式碼時,命令列中所包含的引數
# 該屬性是一個列表,列表中儲存了當前命令的所有引數
# 命令列中輸入 python python檔名 引數1 引數2 ...
print(sys.argv)

# 獲取當前程式中載入的所有模組
# moudules是一個字典,字典的key是模組的名字,字典的value是模組物件
pprint.pprint(sys.modules)

# 它是一個列表,列表中儲存的是模組的搜尋路勁
pprint.pprint(sys.path)

# 表示當前python執行的平臺
print(sys.platform)

# 該函式用來退出程式
sys.exit("程式執行結束")
import os

# 透過這個屬性可以獲取系統的環境變數
print(os.environ,'\n')
print(os.environ["path"],'\n')

# 可以用來執行作業系統的命令
os.system("dir")

五、第三方庫

  在進行 Python 程式開發時,除了可以使用 Python 內建的標準模組外,還可以使用第三方模組。對於這些第三方模組,可以在 Python 官方推出的 http://pypi.python.org/pypi 中找到。在使用第三方模組時,需要先下載並安裝該模組,然後就可以像使用標準模組一樣匯入並使用了。下載和安裝第三方模組可以使用 Python 提供的 pip 命令實現。pip 的語法格式如下:

pip <command> [moudulename]
  • command:用於指定要執行的命令。常用的引數值有 install(用於安裝第三方模組)、uninstall(用於解除安裝已經安裝的第三方模組)、list(用於顯示已經安裝的第三方模組)等;
  • moudulename:可選引數,用於指定要安裝或解除安裝的模組名,當 command 為 install 和 uninstall 時不能省略。

pip 指明在命令列(cmd)中使用;

第三方庫安裝在 Python 直譯器的下的 Lib 目錄下的 site-packages 的目錄;

相關文章