深入理解 Python 中的模組(Module)與套件(Package)
更新日期: 2025 年 1 月 23 日
本文為 python 模組系列文,第二篇
- 初學者指南:如何在 Python 中建立和匯入模組
- 深入理解 Python 中的模組(Module)與套件(Package) 👈所在位置
- 深入理解 Python 中的重複匯入模組
- 函數、模組、套件與框架之間的關係與差異
在學習 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.py
和module_b.py
:套件內的模組。
創建和使用套件
創建套件
- 建立目錄:創建一個資料夾作為套件名稱,例如
my_package
。 - 添加
__init__.py
檔案:在資料夾內添加一個空的__init__.py
檔案,告訴 Python 這是一個套件。 - 添加模組:將相關的模組檔案添加到套件資料夾中。
示例
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 提供了大量的標準模組,可供直接使用,無需額外安裝。例如:
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 會按照一定的順序搜索模組:
- 當前資料夾:首先搜索當前執行檔案所在的資料夾。
PYTHONPATH
環境變數:如果設定了PYTHONPATH
,會在其中指定的資料夾搜索。- 標準庫目錄:搜索 Python 安裝資料夾下的標準模組。
- 安裝的第三方包目錄:如
site-packages
資料夾。
可以通過檢查 sys.path
來查看搜索路徑:
import sys
for path in sys.path:
print(path)
注意事項
- 避免命名衝突:在命名模組和套件時,避免與標準模組或已安裝的第三方模組同名。
- 使用虛擬環境:為了避免套件之間的依賴衝突,建議在開發時使用虛擬環境(如
venv
)。 - 結構清晰:合理組織模組和套件,使程式碼結構清晰,易於維護。
結論
模組和套件是 Python 中組織和管理程式碼的強大工具。
通過將程式碼分割成模組,並使用套件來組織相關的模組,你可以提高程式的可維護性和重用性。
希望通過本文的介紹,你能夠理解並掌握模組和套件的使用方法,進而在實際開發中靈活運用。
進一步學習
- Python 官方文檔:閱讀 Python 模組 相關章節。
- 虛擬環境:學習如何使用
venv
或virtualenv
來管理虛擬環境。 - 發佈自己的套件:了解如何將自己的套件發佈到 PyPI,供他人安裝和使用。