Python 中 DataClass、NamedTuple 和 物件的區別
DataClass、NamedTuple 和 Object 用於在 Python 中建立結構化資料型別。儘管這三種類型都用於建立結構化資料,但它們在屬性和實現方法上有所不同。在本文中,我們將瞭解 Python 中 DataClass、NamedTuple 和 Object 之間的區別。
特性 |
物件 |
NamedTuple |
Dataclass |
---|---|---|---|
建立 |
物件是透過手動定義類及其屬性和方法來建立的。 |
NamedTuple 是使用 collections 模組中的 namedtuple 函式建立的。欄位名稱和值是手動指定的。 |
DataClass 是使用 @dataclass 裝飾器建立的。類屬性和預設值指定為類變數。 |
可讀性 |
物件可能冗長,需要大量樣板程式碼。 |
NamedTuple 是使用 collections 模組中的 namedtuple 函式建立的。欄位名稱和值是手動指定的。 |
DataClass 是使用 @dataclass 裝飾器建立的。類屬性和預設值指定為類變數。 |
不可變性 |
物件預設情況下是可變的,但可以透過使用特殊方法或第三方庫使其不可變。 |
NamedTuple 預設情況下是不可變的,這對於強制資料完整性很有用。 |
DataClass 預設情況下是可變的,但可以透過向 @dataclass 裝飾器新增 frozen=True 引數使其不可變。 |
自動方法 |
物件不提供任何自動方法,例如 __init__、__repr__ 或 __eq__。這些必須手動定義。 |
NamedTuple 預設情況下是不可變的,這對於強制資料完整性很有用。 |
DataClass 預設情況下是可變的,但可以透過向 @dataclass 裝飾器新增 frozen=True 引數使其不可變 |
繼承 |
物件可以用作其他物件的基類,從而實現程式碼重用和自定義。 |
NamedTuple 不支援繼承,但可以使用 _replace 方法進行子類化。 |
DataClass 支援繼承,可以用作其他 DataClass 的基類。 |
預設值 |
物件不為屬性提供預設值。 |
NamedTuple 不為屬性提供預設值,但可以使用關鍵字引數指定欄位名稱和值。 |
DataClass 為屬性提供預設值,這對於處理缺失或可選資料很有用。 |
型別提示 |
物件不提供型別提示,但可以使用註釋或第三方庫手動新增。 |
NamedTuple 不提供型別提示,但可以使用註釋或第三方庫手動新增。 |
DataClass 根據類屬性的型別註釋自動提供型別提示。 |
物件
物件的概念在面向物件程式設計中用於表示程式碼中的任何現實世界實體。在 Python 中,物件是使用類建立的。類是物件的藍圖,它定義了物件的屬性和方法。類的例項稱為物件。
示例
在下面的示例中,我們建立了一個 Person 類,其中包含人的姓名和年齡屬性。然後,您可以建立類的例項,例如下面建立的物件 p1 和 p2。
class Person: def __init__(self, name, age): self.name = name self.age = age p1 = Person("John", 30) p2 = Person("Mary", 25) print(p1.name,p1.age,p2.name,p2.age)
輸出
John 30 Mary 25
NamedTuple
NamedTuple 是 Python 中一個內建類,它定義在 Python 的 collections 模組中。它是使用 namedtuple 工廠函式建立的。namedtuple 工廠函式接受兩個引數 - 元組名稱和欄位名稱序列。
示例
在下面的示例中,我們建立了一個名為 Person 的 namedtuple,它有兩個欄位 - name 和 age。我們建立了 namedtuple 的兩個例項,並在兩者中傳遞 name 和 age 的值。
from collections import namedtuple Person = namedtuple("Person", ["name", "age"]) p1 = Person("John", 30) p2 = Person("Mary", 25) print(p1.name) print(p2.age)
輸出
John 25
DataClass
DataClass 是 Python 中一個裝飾器,它簡化了表示結構化資料的類的建立。它定義在 Python 的 dataclass 模組中,並使用 @dataclass 裝飾器建立。它允許自動生成 __init__、__repr__、eq 函式。
示例
在下面的示例中,定義了一個名為 person 的 DataClass,它具有三個屬性 - name、age 和 city。型別提示用於指定屬性的資料型別,並且還為 city 屬性設定了預設值。然後,我們為 person 類建立了一個例項,並將屬性的值作為引數傳遞。
from dataclasses import dataclass @dataclass class Person: name: str age: int city: str = "New York" p1 = Person("John", 30) p2 = Person("Mary", 25, "Los Angeles") print(p1) print(p2) print(p1 == p2)
輸出
Person(name='John', age=30, city='New York') Person(name='Mary', age=25, city='Los Angeles') False
結論
在本文中,我們討論了 Python 中 DataClass、NamedTuple 和 Object 之間的區別。物件用於面向物件程式設計,NamedTuple 是 Python 的 collections 模組中的內建類,而 DataClass 是一個裝飾器,它簡化了表示結構化資料的類的建立。