Python 模組和 Python 包有什麼區別?


在 Python 中,模組和包都用於組織和構建程式碼,但它們的服務目的略有不同。

Python 模組是一個包含 Python 程式碼的單個檔案,可以匯入並在其他 Python 程式碼中使用。模組可以定義變數、函式、類和其他 Python 結構,這些結構可以被其他程式碼使用。模組是組織程式碼並使其可在多個程式中重複使用的好方法。

另一方面,Python 包是相關 Python 模組的集合,這些模組在一個目錄層次結構中組織。一個包可以包含一個或多個模組,還可以包含其他子包。包用於組織更大的程式碼庫並避免具有相同名稱的模組之間的命名衝突。

以下是一些程式碼示例,用於說明模組和包之間的區別

建立 Python 模組

示例

假設我們有一個名為 my_module.py 的檔案,其中包含以下程式碼

# my_module.py
def hello_world():
    print("Hello, world!")

我們可以透過匯入它在另一個 Python 指令碼中使用此模組

# main.py
import my_module
my_module.hello_world()

當我們執行 main.py 時,它將列印“Hello, world!”。在這種情況下,my_module 是一個模組。

~$python main.py

輸出

Hello, world!

建立 Python 包

現在假設我們想建立一個包含多個模組的包。我們將從建立一個名為 my_package 的目錄開始,其結構如下:

示例

my_package/
├── __init__.py
└── my_module.py

__init__.py 檔案是使 my_package 成為包所必需的。它可以為空,也可以包含包的初始化程式碼。

我們可以將我們的 hello_world 函式放在 my_module.py 中

# my_package/my_module.py
def hello_world():
    print("Hello, world!")

然後我們可以透過匯入模組在另一個 Python 指令碼中使用此包

# main.py
from my_package import my_module
my_module.hello_world()

當我們執行 main.py 時,它將列印 Hello, world!。在這種情況下,my_package 是一個包,my_module 是包中的一個模組。

~$python main.py

輸出

Hello world!

建立巢狀 Python 包

我們還可以透過將模組組織到子目錄中來建立巢狀包。例如,讓我們在 my_package 中建立一個名為 utils 的子目錄,其結構如下:

示例

my_package/
├── __init__.py
├── my_module.py
└── utils
    ├── __init__.py
    └── math_utils.py

__init__.py 檔案再次是使 utils 成為子包所必需的。

我們可以將一些實用函式放在 math_utils.py 中

# my_package/utils/math_utils.py

def add(a, b):
    return a + b

def multiply(a, b):
    return a * b

然後我們可以透過匯入巢狀模組在另一個 Python 指令碼中使用這些實用程式

# main.py
from my_package import my_module
from my_package.utils import math_utils
my_module.hello_world()
result = math_utils.add(2, 3)
print(result)
result = math_utils.multiply(4, 5)
print(result)

當我們執行 main.py 時,它將列印 Hello, world!、5 和 20。在這種情況下,utils 是 my_package 中的子包,math_utils 是子包中的一個模組。

~$python main.py

輸出

Hello, world
5
20

一個模組是單個的 Python 程式碼檔案,可以匯入並在其他 Python 程式中使用。這是一個模組的示例

示例

#my_module.py

def hello(name):
    print(f"Hello, {name}!")

def goodbye(name):
    print(f"Goodbye, {name}!")

你可以在另一個 Python 程式中像這樣使用這個模組

import my_module
my_module.hello("Alice")  
my_module.goodbye("Bob")   

輸出

"Hello, Alice!"
"Goodbye, Bob!"

另一方面,是模組的集合,這些模組在一個目錄層次結構中組織。這是一個包的示例

示例

my_package/
├── __init__.py
├── module1.py
└── module2.py

__init__.py 檔案是將目錄標記為 Python 包所必需的。以下是 module1.py 和 module2.py 檔案可能包含的內容

#module1.py
def add(a, b):
    return a + b

#module2.py
def subtract(a, b):
    return a – b

你可以在另一個 Python 程式中像這樣使用這些模組

import my_package.module1
import my_package.module2
print(my_package.module1.add(2, 3))       
print(my_package.module2.subtract(5, 2))  

輸出

5
3

另一種從包中匯入所有模組的方法是使用 from ... import * 語法。例如

示例

from my_package import *

print(module1.add(2, 3))       
print(module2.subtract(5, 2))  

輸出

5
3

這將從 my_package 包中匯入所有模組到當前名稱空間。但是,此語法有時會導致命名衝突,應謹慎使用。

更新於:2023年8月11日

2K+ 次瀏覽

啟動您的職業生涯

完成課程獲得認證

開始學習
廣告
© . All rights reserved.