深入理解 Python 中的模組(Module)與套件(Package)

更新日期: 2025 年 1 月 23 日

本文為 python 模組系列文,第二篇

  1. 初學者指南:如何在 Python 中建立和匯入模組
  2. 深入理解 Python 中的模組(Module)與套件(Package) 👈所在位置
  3. 深入理解 Python 中的重複匯入模組
  4. 函數、模組、套件與框架之間的關係與差異

在學習 Python 的過程中,你可能會發現程式碼越寫越多,檔案也越來越複雜。

為了更好地組織程式碼,增強重用性和可維護性,Python 提供了 模組(Module)套件(Package) 的概念。

它們是 Python 程式設計中關鍵的組織單位,有助於你編寫出結構清晰、易於維護的程式。

本文將為新手詳細介紹 Python 中的模組與套件,幫助你掌握如何有效地管理和使用它們。


什麼是模組(Module)?

模組 是一個包含 Python 定義和語句的檔案,副檔名為 .py

模組可以定義函式、類別和變數,還可以包含可執行的程式碼。

模組的主要目的在於將程式碼分割成小的、可重用的部分,從而提高程式的可維護性和重用性。

為什麼要使用模組?

  • 代碼重用:將常用的函式或類別放入模組,方便在多個程式中使用。
  • 命名空間:模組為函式和變數提供了獨立的命名空間,避免命名衝突。
  • 結構化代碼:使程式碼更有組織性,易於維護和閱讀。

如何創建和使用模組

創建模組

創建一個模組非常簡單,只需將相關的程式碼保存在一個 .py 檔案中。

例如,我們創建一個名為 my_module.py 的檔案,內容如下:

# my_module.py

def greet(name):
    return f"Hello, {name}!"

def add(x, y):
    return x + y

pi = 3.14159

使用模組

在另一個 Python 檔案或互動式命令列中,我們可以使用 import 語句匯入模組:

import my_module

message = my_module.greet("Alice")
print(message)  # 輸出:Hello, Alice!

result = my_module.add(5, 3)
print(result)  # 輸出:8

print(my_module.pi)  # 輸出:3.14159

使用 from...import 語句

我們還可以只匯入模組中的特定部分:

from my_module import greet, pi

print(greet("Bob"))  # 輸出:Hello, Bob!
print(pi)            # 輸出:3.14159

給匯入的模組或函式起別名

import my_module as mm

print(mm.greet("Charlie"))  # 輸出:Hello, Charlie!

from my_module import add as addition

print(addition(10, 20))  # 輸出:30

什麼是套件(Package)?

套件 是一種用於組織相關模組的方式,本質上是一個包含 __init__.py 檔案的目錄。

套件允許你將相關的模組組織在一起,形成層次化的命名空間。

這對於大型程式或需要組織大量模組的情況特別有用。

套件的結構

一個簡單的套件結構可能如下:

my_package/
    __init__.py
    module_a.py
    module_b.py
  • my_package:套件目錄名稱。
  • __init__.py:這個檔案可以是空的,表示 my_package 是一個 Python 套件。(早期 python 設定模組時,一定要有此檔案。現在建立模組則不再被要求設為必要條件。)
  • module_a.pymodule_b.py:套件內的模組。

創建和使用套件

創建套件

  1. 建立目錄:創建一個資料夾作為套件名稱,例如 my_package
  2. 添加 __init__.py 檔案:在資料夾內添加一個空的 __init__.py 檔案,告訴 Python 這是一個套件。
  3. 添加模組:將相關的模組檔案添加到套件資料夾中。

示例

my_package/__init__.py

# 可以留空,或在此定義需要在套件級別匯出的內容

my_package/module_a.py

def func_a():
    print("這是 module_a 中的 func_a")

my_package/module_b.py

def func_b():
    print("這是 module_b 中的 func_b")

使用套件

import my_package.module_a
import my_package.module_b

my_package.module_a.func_a()  # 輸出:這是 module_a 中的 func_a
my_package.module_b.func_b()  # 輸出:這是 module_b 中的 func_b

使用 from...import 語句

from my_package.module_a import func_a
from my_package.module_b import func_b

func_a()  # 輸出:這是 module_a 中的 func_a
func_b()  # 輸出:這是 module_b 中的 func_b

部分匯入

在套件內部,可以使用部分匯入來引用同一套件內的其他模組。

示例

修改 my_package/module_a.py

from .module_b import func_b

def func_a():
    print("這是 module_a 中的 func_a")
    func_b()

使用

from my_package import module_a

module_a.func_a()

輸出:

這是 module_a 中的 func_a
這是 module_b 中的 func_b
  • from .module_b import func_b:使用部分匯入,表示從當前套件中匯入 module_b

__init__.py 的作用

  • 標識套件:只要目錄中包含 __init__.py,Python 就會將其視為套件。
  • 初始化代碼:可以在 __init__.py 中添加初始化代碼或設定套件級別的變數和函式。
  • 控制匯出內容:可以使用 __all__ 列表定義 from package import * 時匯出的模組或函式。

示例

my_package/__init__.py

__all__ = ["module_a", "module_b"]

def package_func():
    print("這是 my_package 中的 package_func")

使用

from my_package import *

module_a.func_a()
module_b.func_b()
package_func()

延伸閱讀:深入理解 Python 中的 init.py


標準模組與第三方模組

標準模組

Python 提供了大量的標準模組,可供直接使用,無需額外安裝。例如:

  • math:數學函式
  • datetime:日期和時間
  • os:操作系統介面
  • sys:Python 解釋器相關

第三方模組

第三方模組需要通過 pip 進行安裝。例如:

pip install requests

安裝後即可在程式中使用:

import requests

response = requests.get("https://www.example.com")
print(response.status_code)

延伸閱讀:新手指南:什麼是 Python 的 PyPI 套件?


模組的搜索路徑

當你使用 import 語句時,Python 會按照一定的順序搜索模組:

  1. 當前資料夾:首先搜索當前執行檔案所在的資料夾。
  2. PYTHONPATH 環境變數:如果設定了 PYTHONPATH,會在其中指定的資料夾搜索。
  3. 標準庫目錄:搜索 Python 安裝資料夾下的標準模組。
  4. 安裝的第三方包目錄:如 site-packages 資料夾。

可以通過檢查 sys.path 來查看搜索路徑:

import sys

for path in sys.path:
    print(path)

注意事項

  1. 避免命名衝突:在命名模組和套件時,避免與標準模組或已安裝的第三方模組同名。
  2. 使用虛擬環境:為了避免套件之間的依賴衝突,建議在開發時使用虛擬環境(如 venv)。
  3. 結構清晰:合理組織模組和套件,使程式碼結構清晰,易於維護。

結論

模組和套件是 Python 中組織和管理程式碼的強大工具。

通過將程式碼分割成模組,並使用套件來組織相關的模組,你可以提高程式的可維護性和重用性。

希望通過本文的介紹,你能夠理解並掌握模組和套件的使用方法,進而在實際開發中靈活運用。


進一步學習

  • Python 官方文檔:閱讀 Python 模組 相關章節。
  • 虛擬環境:學習如何使用 venvvirtualenv 來管理虛擬環境。
  • 發佈自己的套件:了解如何將自己的套件發佈到 PyPI,供他人安裝和使用。

Similar Posts