dataclass簡介
dataclass的定義位于PEP-557,根據(jù)定義一個dataclass是指“一個帶有默認(rèn)值的可變的namedtuple”,廣義的定義就是有一個類,它的屬性均可公開訪問,可以帶有默認(rèn)值并能被修改,而且類中含有與這些屬性相關(guān)的類方法,那么這個類就可以稱為dataclass,再通俗點講,dataclass就是一個含有數(shù)據(jù)及操作數(shù)據(jù)方法的容器。
乍一看可能會覺得這個概念不就是普通的class么,然而還是有幾處不同:
1.相比普通class,dataclass通常不包含私有屬性,數(shù)據(jù)可以直接訪問
2.dataclass的repr方法通常有固定格式,會打印出類型名以及屬性名和它的值
3.dataclass擁有__eq__和__hash__魔法方法
4.dataclass有著模式單一固定的構(gòu)造方式,或是需要重載運算符,而普通class通常無需這些工作
基于上述原因,通常自己實現(xiàn)一個dataclass是繁瑣而無聊的,而dataclass單一固定的行為正適合程序為我們自動生成,于是dataclasses模塊誕生了。
配合類型注解語法,我們可以輕松生成一個實現(xiàn)了__init__,__repr__,__cmp__等方法的dataclass:
from dataclasses import dataclass@dataclassclass InventoryItem: '''Class for keeping track of an item in inventory.''' name: str unit_price: float quantity_on_hand: int = 0 def total_cost(self) -> float: return self.unit_price * self.quantity_on_hand
同時使用dataclass也有一些好處,它比namedtuple更靈活。同時因為它是一個常規(guī)的類,所以你可以享受繼承帶來的便利。
dataclass的使用
我們分x步介紹dataclass的使用,首先是如何定義一個dataclass。
定義一個dataclass
dataclasses模塊提供了一個裝飾器幫助我們定義自己的數(shù)據(jù)類:
@dataclassclass Lang: """a dataclass that describes a programming language""" name: str = 'python' strong_type: bool = True static_type: bool = False age: int = 28
我們定義了一個描述某種程序語言特性的數(shù)據(jù)類——Lang,在接下來的例子中我們都會用到這個類。
在數(shù)據(jù)類被定義后,會根據(jù)給出的類型注解生成一個如下的初始函數(shù):
def __init__(self, name: str='python', strong_type: bool=True, static_type: bool=False, age: int=28): self.name = name self.strong_type = strong_type self.static_type = static_type self.age = age
可以看到初始化操作都已經(jīng)自動生成了,讓我們試用一下:
>>> Lang()Lang(name='python', strong_type=True, static_type=False, age=28)>>> Lang('js', False, False, 23)Lang(name='js', strong_type=False, static_type=False, age=23)>>> Lang('js', False, False, 23) == Lang()False>>> Lang('python', True, False, 28) == Lang()True            
新聞熱點
疑難解答