国产av一二三区|日本不卡动作网站|黄色天天久久影片|99草成人免费在线视频|AV三级片成人电影在线|成年人aV不卡免费播放|日韩无码成人一级片视频|人人看人人玩开心色AV|人妻系列在线观看|亚洲av无码一区二区三区在线播放

網(wǎng)易首頁 > 網(wǎng)易號 > 正文 申請入駐

Python 裝飾器:@dataclass

0
分享至

在 Python 中,類通常用于封裝數(shù)據(jù)和行為。傳統(tǒng)方式下,定義一個類并實現(xiàn)初始化方法 (__init__)、表示方法 (__repr__) 和比較方法 (__eq__) 等需要編寫大量重復(fù)代碼。對于主要用于存儲數(shù)據(jù)的類,這些樣板代碼顯得繁瑣且易出錯。

@dataclass 裝飾器就是為簡化此類場景而設(shè)計的,它自動生成初始化函數(shù)、表示函數(shù)、比較函數(shù)等,使數(shù)據(jù)類的定義簡潔、清晰,并保持類型提示完整。

一、什么是 @dataclass

@dataclass 是 Python 3.7 引入的內(nèi)置裝飾器(位于 中),用于聲明“數(shù)據(jù)類”(Data Class)。

數(shù)據(jù)類的核心特點:

(1)自動生成初始化方法

根據(jù)類屬性生成 __init__ 方法。

(2)自動生成表示方法

生成 __repr__ 方法,便于調(diào)試和日志輸出。

(3)自動生成比較方法

可選生成 __eq__、__lt__ 等方法,實現(xiàn)對象比較。

(4)支持類型提示

屬性可通過類型注解聲明,增強(qiáng)可讀性和靜態(tài)分析能力。

(5)可選字段控制

可通過模塊中的 field() 自定義默認(rèn)值、初始化行為、比較參與情況等。

默認(rèn)情況下,@dataclass 會生成 __init__、__repr__ 和 __eq__ 方法,但不會生成排序相關(guān)方法(需要顯式指定 order=True)。

二、基本用法

1、定義數(shù)據(jù)類

    y: float

自動生成:

def __eq__(self, other): ...

2、使用數(shù)據(jù)類

print(p1 == p3)    # False

數(shù)據(jù)類讓類定義簡潔,代碼可讀性大幅提升。

三、字段自定義

dataclasses.field 提供更多靈活選項:

    id: int = field(init=False, repr=False)    # 不在 __init__ 中初始化,不在 __repr__ 中顯示

init=False:字段不參與初始化方法

repr=False:字段不參與 __repr__ 輸出

compare=False:字段不參與對象比較

default / default_factory:設(shè)置默認(rèn)值或生成默認(rèn)值的工廠函數(shù)

其中,default_factory 參數(shù)用于生成可變默認(rèn)值(如列表、字典),避免所有實例共享同一引用:

    grades: list[int] = field(default_factory=list)    # 每個實例獨立列表

四、裝飾器常用參數(shù)

@dataclass 裝飾器可接收參數(shù)控制行為。

常用參數(shù)包括:init、repr、eq、order、frozen,以及 Python 3.10+ 引入的 slots、kw_only 等。

order=True

自動生成 <、<=、>、>= 等比較方法,默認(rèn)使用字段定義順序。

提示:

order=True 依賴 eq=True,如果顯式關(guān)閉 eq,將無法生成排序方法。

frozen=True

生成不可變對象,類似于 namedtuple,嘗試修改屬性會拋出 FrozenInstanceError。

slots=True(Python 3.10+)

使用 __slots__ 優(yōu)化內(nèi)存和訪問速度,防止動態(tài)添加新屬性。

kw_only=True(Python 3.10+)

強(qiáng)制使用關(guān)鍵字參數(shù)初始化,提升代碼可讀性并避免參數(shù)順序錯誤:

cfg = Config(host="localhost")    # 必須關(guān)鍵字傳參

五、__post_init__ 特殊方法

數(shù)據(jù)類支持 __post_init__ 方法,用于在 __init__ 執(zhí)行后完成額外初始化操作(如計算派生字段或驗證數(shù)據(jù)):

        self.area = self.width * self.height

提示:

如果使用 frozen=True,在 __post_init__ 中需要通過 object.__setattr__(self, "area", value) 來設(shè)置屬性,否則會觸發(fā) FrozenInstanceError。

六、典型應(yīng)用場景

(1)簡化數(shù)據(jù)存儲類

print(r.area())    # 50

(2)不可變配置對象

cfg.port = 9090  # 報錯:FrozenInstanceError

(3)排序與比較

print(players)    # 按 score 排序

排序規(guī)則默認(rèn)按字段定義順序進(jìn)行比較,相當(dāng)于比較 (score, name)。

七、與傳統(tǒng)類對比

特性

傳統(tǒng)類

數(shù)據(jù)類(@dataclass)

__init__

手動編寫

自動生成

__repr__

手動

自動生成

__eq__

手動

自動生成

排序

手動

order=True

類型提示

可選

強(qiáng)烈推薦

默認(rèn)值

手動

field(default=…)

數(shù)據(jù)類主要用于存儲數(shù)據(jù),不適合包含大量業(yè)務(wù)邏輯的方法。對于復(fù)雜邏輯,可將數(shù)據(jù)類與實例方法結(jié)合使用。

八、與其他數(shù)據(jù)容器的對比

(1)與 typing.NamedTuple 的對比

NamedTuple 繼承自元組,不可變且支持拆包,但擴(kuò)展性較弱。

@dataclass 更靈活,支持可變性、默認(rèn)值控制及繼承,內(nèi)存占用略高于 NamedTuple。

(2)性能與內(nèi)存考慮

默認(rèn)數(shù)據(jù)類使用 __dict__ 存儲屬性,可通過 slots=True 減少內(nèi)存占用(Python 3.10+)。

對性能敏感場景(如創(chuàng)建大量對象),可測試對比 @dataclass、NamedTuple 或傳統(tǒng)類。

(3)類型檢查器的支持

主流類型檢查工具(如 mypy、Pyright)能識別 @dataclass,確保類型注解被正確驗證,增強(qiáng)代碼健壯性。

九、常見誤區(qū)

(1)誤認(rèn)為數(shù)據(jù)類字段必須有默認(rèn)值

非默認(rèn)字段必須出現(xiàn)在默認(rèn)字段之前,否則會報錯:

    b: int = 0  # 正確

(2)濫用 frozen=True 修改對象

凍結(jié)對象無法修改屬性,嘗試修改會拋出 FrozenInstanceError。

(3)與繼承組合時的注意事項

子類繼承數(shù)據(jù)類時,字段順序和默認(rèn)值需謹(jǐn)慎,否則可能引發(fā)構(gòu)造函數(shù)沖突。

(4)不適合包含大量業(yè)務(wù)邏輯的方法

數(shù)據(jù)類核心目的是簡化數(shù)據(jù)封裝,邏輯應(yīng)以實例方法或外部函數(shù)實現(xiàn)。

小結(jié)

@dataclass 裝飾器用于簡化數(shù)據(jù)類定義,自動生成構(gòu)造方法、表示方法、比較方法等,提高代碼可讀性與可維護(hù)性。結(jié)合 field() 可以自定義默認(rèn)值、比較邏輯及初始化行為。通過 frozen=True、order=True 和 slots=True 等參數(shù),數(shù)據(jù)類可以支持不可變對象、排序和內(nèi)存優(yōu)化。數(shù)據(jù)類非常適合存儲數(shù)據(jù)、實現(xiàn)配置對象、排序?qū)ο蠡蜉p量級結(jié)構(gòu)體,同時保持類型提示和代碼簡潔性。


點贊有美意,贊賞是鼓勵

特別聲明:以上內(nèi)容(如有圖片或視頻亦包括在內(nèi))為自媒體平臺“網(wǎng)易號”用戶上傳并發(fā)布,本平臺僅提供信息存儲服務(wù)。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相關(guān)推薦
熱點推薦
再這么搞下去,中產(chǎn)家長們的崩塌就是早晚的事

再這么搞下去,中產(chǎn)家長們的崩塌就是早晚的事

重遠(yuǎn)投資觀
2026-01-10 20:55:25
皇馬的痛!19歲恩德里克獲8.2分+MVP:首秀一劍封喉,助法甲勁旅晉級

皇馬的痛!19歲恩德里克獲8.2分+MVP:首秀一劍封喉,助法甲勁旅晉級

側(cè)身凌空斬
2026-01-12 05:57:37
怒了!許利民:球員在擺譜、擺大牌,我們輸?shù)氖潜本┑男蜗蠛妥饑?yán)

怒了!許利民:球員在擺譜、擺大牌,我們輸?shù)氖潜本┑男蜗蠛妥饑?yán)

懂球帝
2026-01-11 22:54:27
這個東南亞小國從不避孕,人口已經(jīng)過億,是全球最開放的國家

這個東南亞小國從不避孕,人口已經(jīng)過億,是全球最開放的國家

犀利辣椒
2026-01-11 06:40:29
老板大氣!蘇州一工廠給員工發(fā)年終獎,按工齡1年1000,上不封頂

老板大氣!蘇州一工廠給員工發(fā)年終獎,按工齡1年1000,上不封頂

火山詩話
2026-01-12 06:54:34
合川千人赴約殺豬飯后續(xù):女子闖大禍,原地嚇呆,文旅連夜下場

合川千人赴約殺豬飯后續(xù):女子闖大禍,原地嚇呆,文旅連夜下場

鋭娛之樂
2026-01-11 22:06:10
閆學(xué)晶事件升級!多家官媒怒批后,又一壞消息傳來,這下麻煩大了

閆學(xué)晶事件升級!多家官媒怒批后,又一壞消息傳來,這下麻煩大了

天天熱點見聞
2026-01-11 08:37:35
U23國足首勝!媒體人熱議:茍著踢有道理,邵佳一多挑幾個吧

U23國足首勝!媒體人熱議:茍著踢有道理,邵佳一多挑幾個吧

奧拜爾
2026-01-11 21:37:55
家中老人突然離世!與保姆分房睡時摔倒,家屬怒告!深圳法院:不用賠

家中老人突然離世!與保姆分房睡時摔倒,家屬怒告!深圳法院:不用賠

南方都市報
2026-01-11 20:52:48
馬斯克:X平臺將于一周內(nèi)開源新算法

馬斯克:X平臺將于一周內(nèi)開源新算法

界面新聞
2026-01-11 10:30:09
王毅同索馬里外長德埃電話會談

王毅同索馬里外長德埃電話會談

界面新聞
2026-01-11 18:49:08
燒光500億的“中國寶馬”,引爆2026年第一顆雷

燒光500億的“中國寶馬”,引爆2026年第一顆雷

金錯刀
2026-01-10 20:09:00
格陵蘭島普通百姓:囤糧、存錢,努力保持冷靜,本以為美國是盟友,不料竟成其獵物

格陵蘭島普通百姓:囤糧、存錢,努力保持冷靜,本以為美國是盟友,不料竟成其獵物

紅星新聞
2026-01-11 17:33:21
澳大利亞U23主帥:下半場只有一支球隊在進(jìn)攻;中國隊防守嚴(yán)密

澳大利亞U23主帥:下半場只有一支球隊在進(jìn)攻;中國隊防守嚴(yán)密

懂球帝
2026-01-11 22:32:26
瑞典軍工發(fā)布導(dǎo)彈視頻:1枚導(dǎo)彈命中摧毀中國052d型驅(qū)逐艦!

瑞典軍工發(fā)布導(dǎo)彈視頻:1枚導(dǎo)彈命中摧毀中國052d型驅(qū)逐艦!

達(dá)文西看世界
2026-01-11 19:10:20
個人所得稅減半征收政策!延續(xù)至2027年12月31日!

個人所得稅減半征收政策!延續(xù)至2027年12月31日!

審計之家
2026-01-11 09:03:14
輸球又輸人!皇馬決賽最慘之人:阿隆索親手將他打入冷宮

輸球又輸人!皇馬決賽最慘之人:阿隆索親手將他打入冷宮

瀾歸序
2026-01-12 05:35:15
荒誕!反向騙取電詐團(tuán)伙1800元,不但無功,竟然還得坐牢?!

荒誕!反向騙取電詐團(tuán)伙1800元,不但無功,竟然還得坐牢?!

阿陸
2026-01-11 15:27:57
霍啟剛主動公開個人財產(chǎn):35套物業(yè)曝光,遍及港澳、內(nèi)地與法、英,多項房產(chǎn)與郭晶晶共同持有

霍啟剛主動公開個人財產(chǎn):35套物業(yè)曝光,遍及港澳、內(nèi)地與法、英,多項房產(chǎn)與郭晶晶共同持有

大象新聞
2026-01-12 00:17:04
以色列在行動,伊朗導(dǎo)彈部隊指揮官遭刺殺,庫爾德武裝發(fā)起進(jìn)攻

以色列在行動,伊朗導(dǎo)彈部隊指揮官遭刺殺,庫爾德武裝發(fā)起進(jìn)攻

史政先鋒
2026-01-11 15:58:18
2026-01-12 08:12:49
MediaTea
MediaTea
專業(yè)的數(shù)字媒體、新媒體技術(shù)
1701文章數(shù) 72關(guān)注度
往期回顧 全部

科技要聞

“我們與美國的差距也許還在拉大”

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

頭條要聞

李獻(xiàn)林學(xué)習(xí)教育期間違規(guī)吃喝:5人喝4瓶酒 1人酒后死亡

體育要聞

U23國足形勢:末輪不負(fù)泰國即確保晉級

娛樂要聞

留幾手為閆學(xué)晶叫屈?稱網(wǎng)友自卑敏感

財經(jīng)要聞

外賣平臺"燒錢搶存量市場"迎來終局?

汽車要聞

2026款宋Pro DM-i長續(xù)航補(bǔ)貼后9.98萬起

態(tài)度原創(chuàng)

教育
房產(chǎn)
數(shù)碼
游戲
軍事航空

教育要聞

1分鐘說清!山西工程科技職業(yè)大學(xué)專業(yè)錄取線

房產(chǎn)要聞

66萬方!4755套!三亞巨量房源正瘋狂砸出!

數(shù)碼要聞

科技有AI,連接全球:海信家電參展CES 2026,定義智慧生活新圖景

這款帥到掉渣的GBA神作《洛克人ZERO》,被模仿無數(shù)次仍是巔峰

軍事要聞

俄大使:馬杜羅夫婦被控制時身邊沒人

無障礙瀏覽 進(jìn)入關(guān)懷版