1. 為什麼在 Python 需要使用結構體
Python 是一種高階程式語言,並不像 C 語言那樣提供直接的「結構體」(struct)功能。然而,在某些情況下,我們可能會希望將多個相關的數據組合在一起,以類似 C 語言結構體的方式進行管理。特別是在管理來自資料庫的數據、檔案操作、或網路通訊等場景時,能夠有效處理數據結構是非常重要的。
什麼時候需要結構體
在以下情境中,Python 提供類似結構體的數據管理方法將特別有用:
- 需要管理大量相關數據時:例如,用戶資訊、產品數據等,這些數據集合通常包含多個屬性,需要以組織化的方式來管理。
- 處理檔案或網路通訊時:在進行二進制數據的打包(pack)與解包(unpack)時,或在特定格式的數據傳輸過程中,類似 C 語言結構體的數據管理方式將會特別有幫助。
2. 使用 Python dataclass
模擬結構體
dataclass
是 Python 3.7 引入的模組,能夠簡潔地定義類別,並提供類似結構體的數據管理方式。相較於 C 語言的結構體,dataclass
更具靈活性,且符合 Python 的語法風格。
dataclass
的基本用法與應用範例
使用 dataclass
可以簡化數據結構的定義,並且無需手動撰寫初始化方法(__init__
)。以下是一個基本的應用範例:
from dataclasses import dataclass
@dataclass
class Book:
title: str
author: str
price: float
在這個範例中,我們定義了一個名為 Book
的數據類別,每個屬性(title
、author
、price
)會自動在 __init__
方法中初始化,使物件的建立變得更加簡單。
book1 = Book("Python 入門", "佐藤", 2800)
print(book1) # 輸出: Book(title='Python 入門', author='佐藤', price=2800)
dataclass
的進階功能
此外,dataclass
允許我們為屬性設置預設值,使其在某些屬性是可選時更加靈活。
@dataclass
class Product:
name: str
price: float = 0.0 # 設定預設值
透過這種方式,dataclass
能夠有效地管理簡單的數據結構,提升數據管理的靈活性與程式的可讀性。

3. 使用 Python struct
模組進行類似結構體的數據操作
另一方面,Python 的 struct
模組提供了更接近 C 語言結構體的操作方式。特別是在處理二進制數據的打包(pack)與解包(unpack)方面,struct
擁有豐富的功能,適用於網路通訊與檔案處理。
struct
模組的基本用法
以下範例示範如何將整數與浮點數打包成位元組(bytes),然後再解包回原始數據:
import struct
# 將整數與浮點數打包成位元組
packed_data = struct.pack('if', 1024, 3.14)
print(packed_data) # 輸出: b'x00x04x00x00xc3xf5H@'
# 解包回原始數據
unpacked_data = struct.unpack('if', packed_data)
print(unpacked_data) # 輸出: (1024, 3.140000104904175)
在這個範例中,使用 struct.pack()
方法將整數與浮點數轉換成二進制格式,然後透過 struct.unpack()
進行解包,還原為原始數據。在處理二進制數據時,struct
可透過格式字串(如 i
代表整數,f
代表浮點數)來定義數據結構。
處理更複雜的數據類型
此外,struct
也可以同時處理多種數據類型。以下範例示範如何將字串、整數與浮點數打包並解包:
packed_data = struct.pack('i4sf', 1, b'test', 2.7)
print(packed_data) # 輸出: b'x01x00x00x00testxcdxcc,@'
unpacked_data = struct.unpack('i4sf', packed_data)
print(unpacked_data) # 輸出: (1, b'test', 2.700000047683716)
這種方式對於需要高效處理二進制數據的應用場景,例如網路傳輸或檔案存儲,特別有幫助。

4. 如何選擇使用 dataclass
或 struct
dataclass
和 struct
在數據管理方面各自具有不同的特點。這裡將說明應該如何根據使用場景來選擇適合的方法。
適合使用 dataclass
的情境
- 需要管理輕量級數據時:
dataclass
非常適合處理類似結構體的數據,特別是在 Web 應用或數據處理場景中,例如管理用戶資訊。 - 可讀性與靈活性很重要時:
dataclass
提供簡潔的語法,使程式碼更易讀,也更容易維護。
適合使用 struct
的情境
- 涉及二進制數據時:
struct
適用於需要處理二進制格式的應用,例如網路通訊或二進制檔案操作。 - 希望最大化記憶體效率時:
struct
可以更有效地管理數據,特別是在處理大量數據時,能夠減少記憶體使用量並提高效能。
5. 使用結構體的實際應用案例
dataclass
的實戰應用:商品數據管理系統
接下來,我們將介紹一個使用 dataclass
來管理商品資訊的實際案例。以下的程式碼展示了一個簡單的電子商務商品管理系統:
from dataclasses import dataclass
@dataclass
class Product:
name: str
price: float
stock: int
# 建立商品數據
product1 = Product("筆記型電腦", 150000, 30)
product2 = Product("智慧型手機", 80000, 50)
print(product1) # 輸出: Product(name='筆記型電腦', price=150000, stock=30)
透過 dataclass
,我們可以輕鬆定義商品數據結構,並簡單地管理產品庫存,使代碼更清晰且易於擴展。
struct
的實戰應用:在網路通訊中傳輸二進制數據
struct
在網路通訊領域非常有用,因為它可以有效地將數據轉換為二進制格式,方便傳輸。以下範例展示如何在伺服器與客戶端之間傳輸打包的二進制數據:
import struct
# 將數據打包並準備發送(模擬伺服器發送數據)
data_to_send = struct.pack('i4sf', 42, b'data', 7.5)
print(data_to_send) # 輸出: b'x2ax00x00x00datax00x00x00x00x00x00x00'
# 客戶端接收數據並解包
received_data = struct.unpack('i4sf', data_to_send)
print(received_data) # 輸出: (42, b'data', 7.5)
這段程式碼示範了如何使用 struct
來將數據(整數、字串、浮點數)打包為二進制格式,然後在接收端解包還原為原始數據。這種方法在通訊協議設計中極為常見,例如 TCP/IP 連線或嵌入式系統數據傳輸。

6. 總結
在 Python 中,我們可以透過 dataclass
和 struct
來實現類似 C 語言結構體的數據管理方式。這兩種方法各有其適用場景,以下是它們的主要特點:
dataclass
:適用於需要管理結構化數據的場景,例如應用程式中的用戶數據或產品資訊。它能讓代碼更簡潔,提高可讀性和可維護性。struct
:適用於需要處理二進制數據的場景,例如網路通訊、二進制檔案操作等。它提供了高效的數據打包與解包功能,使數據傳輸更節省記憶體。
根據不同的應用需求,選擇適合的數據管理工具,能夠提升 Python 程式的效率與靈活性。希望本文能幫助你更好地理解 dataclass
與 struct
,並在實際開發中靈活運用它們!