Python 中的資料類 (dataclasses)


dataclasses 是 Python 標準庫中從 3.7 版本開始新增的一個模組。它定義了 @dataclass 裝飾器,該裝飾器會自動為使用者定義的類生成建構函式魔法方法 __init__()、字串表示方法 __repr__()、過載 == 運算子的 __eq__() 方法(以及其他一些方法)。

dataclass 裝飾器具有以下簽名

dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)

所有引數都採用布林值,指示是否自動生成相應魔法方法。

“init” 引數預設為 True。它將自動為類生成 __init__() 方法。

讓我們使用 dataclass 裝飾器定義 Student 類,如下所示

from dataclasses import dataclass

@dataclass
class Student(object):
   name : str
   age : int
   percent : float

自動生成的 __init__() 方法類似於

def __init__(self, name: str, age: int, percent: float):
   self.name = name
   self.age = age
   self.percent = percent

如果類顯式定義了 __init__() 方法,則忽略 init 引數。

repr 引數也預設為 true。因此,__repr__() 方法將自動生成。__repr__() 是物件的正式字串表示形式。如果類已定義 __repr__(),則忽略此引數。

eq 引數預設為 true。這將自動生成 __eq__() 方法。此方法在響應等於比較運算子 (==) 時被呼叫。同樣,如果類已定義 __eq__(),則忽略此引數。

如果 “order” 引數為 true(預設值為 False),則將自動生成用於比較的魔法方法 __lt__()、__le__()、__gt__() 和 __ge__() 方法,它們分別實現比較運算子 < <= > 和 >=。如果 order 為 true 且 eq 為 false,則會引發 ValueError。如果類已定義任何這些方法,則會導致 TypeError。

unsafe_hash 引數如果為 False(預設值),則根據 eq 和 frozen 的設定生成 __hash__() 方法。

frozen 引數:如果為 true(預設為 False),則模擬只讀凍結例項。

>>> from data_class import Student
>>> s1=Student('Naveen', 21, 50.50)
>>> s2=Student('Mangesh', 20, 50.00)
>>> s1==s2
False

asdict()

此函式將類例項轉換為字典物件。

>>> import dataclasses
>>> dataclasses.asdict(s1)
{'name': 'Naveen', 'age': 21, 'percent': 50.5}

astuple()

此函式將類例項轉換為元組物件。

>>> dataclasses.astuple(s2)
('Mahesh', 20, 50.0)

make_dataclass()

此函式根據作為 fields 引數給出的元組列表建立新的 dataclass。

>>> NewClass=dataclasses.make_dataclass('NewClass', [('x',int),('y',float)])
>>> n = NewClass(10,20)
>>> n
NewClass(x=10, y=20)

更新於: 2019年7月30日

610 次瀏覽

啟動您的 職業生涯

透過完成課程獲得認證

開始
廣告

© . All rights reserved.