介紹 Python 3.7 中有一個(gè)新特性, 你可以使用一個(gè)裝飾器 @dataclass 來(lái)簡(jiǎn)化創(chuàng)建數(shù)據(jù)類的過(guò)程,,新創(chuàng)建的數(shù)據(jù)類將自帶有__init__ 和__repr__ ,。 數(shù)據(jù)類是一種用來(lái)存儲(chǔ)數(shù)據(jù)的類,這種類往往不需要自定義的方法,。通常,,我們也管它叫數(shù)據(jù)結(jié)構(gòu)。例如,,一個(gè)存儲(chǔ)點(diǎn)的三維坐標(biāo)值的類,,往往就只需要三個(gè)字段 (x, y, z)。 然而,,如果我們用以前的方式實(shí)現(xiàn)一個(gè)數(shù)據(jù)類,,那我們不可避免地需要自己編寫一個(gè)__init__方法,一個(gè)字符串表示的內(nèi)置方法,,和一個(gè)比較函數(shù)等等,。這些方法的邏輯顯而易見(jiàn),如果語(yǔ)言能夠自動(dòng)地處理,,那就再好不過(guò)了,。 事實(shí)上,其他一些語(yǔ)言,,如 Kotlin,,已經(jīng)提供了構(gòu)建數(shù)據(jù)類的便捷方式,,Java也可以通過(guò)Lombok庫(kù)來(lái)使用 @Data 標(biāo)記構(gòu)建數(shù)據(jù)類。 例子 這里是使用dataclass的一個(gè)例子 默認(rèn)情況下,,裝飾器會(huì)自動(dòng)生成初始化函數(shù),、比較函數(shù)和字符串表示函數(shù)。 換言之,,上面代碼等同于下面的舊式代碼: 注意這個(gè)例子也可以使用 namedtuple 完成,,但是實(shí)現(xiàn)的代碼可讀性就差了很多,雖然確實(shí)比上面例子更短了: DATACLASS參數(shù) @dataclass 裝飾器可以接受幾個(gè)參數(shù)來(lái)控制自動(dòng)生成的方法的行為:
init : 如果 True, 生成__init__ 方法,。
repr : 如果 True, 生成__repr__ 方法,。
eq : 如果 True, 生成__eq__ 方法,比較邏輯就是把數(shù)據(jù)當(dāng)作一個(gè)元組來(lái)比較,。
order : 如果 True, 生成__lt__ ,__le__ ,__gt__ , 和__ge__ 方法,。
unsafe_hash : 如果 False, 依據(jù)eq 和frozen 的值生成__hash__ 方法。 如果 True,,生成__hash__ 方法,。
frozen : 如果 True, 生成的對(duì)象就是不可變的 (只讀).
字段配置 在 dataclasses 模塊中, 有一個(gè)field 函數(shù),它可以用來(lái)做字段級(jí)別的配置: 通過(guò)它你可以控制一個(gè)字段的默認(rèn)值, 該字段是否應(yīng)該顯示在 __repr__ 中,,是否應(yīng)該被比較函數(shù)忽略,,是否應(yīng)該計(jì)算在__hash__ 中, 等等。 初始化后處理 生成的 __init__ 代碼會(huì)調(diào)用一個(gè)叫__post_init__ 的函數(shù),。 如果你需要依據(jù)基礎(chǔ)數(shù)據(jù)生成一些衍生數(shù)據(jù),,那么這個(gè)函數(shù)會(huì)很有用。 注意如果__init__ 方法沒(méi)有生成, 那么__post_init__ 也不會(huì)執(zhí)行,。 其他DATACLASS方法 dataclasses 模塊還提供了很多其他的有用的函數(shù): fields : 返回Field 對(duì)象的元組,。 一個(gè)Field 對(duì)象包含一個(gè)字段的配置。
asdict : 將數(shù)據(jù)類實(shí)例轉(zhuǎn)換為對(duì)應(yīng)字段的字典,。
astuple : 將數(shù)據(jù)類實(shí)例轉(zhuǎn)換為對(duì)應(yīng)字段的元組,。
make_dataclass : 動(dòng)態(tài)創(chuàng)建一個(gè)數(shù)據(jù)類。
replace : 拷貝數(shù)據(jù)類實(shí)例,,并修改部分字段,。
is_dataclass : 判斷一個(gè)對(duì)象是否是指定數(shù)據(jù)類的對(duì)象。
英文原文:https://www./playgrounds/37245/python-dataclass
|