<cite id="ffb66"></cite><cite id="ffb66"><track id="ffb66"></track></cite>
      <legend id="ffb66"><li id="ffb66"></li></legend>
      色婷婷久,激情色播,久久久无码专区,亚洲中文字幕av,国产成人A片,av无码免费,精品久久国产,99视频精品3
      網易首頁 > 網易號 > 正文 申請入駐

      Python 裝飾器:@dataclass

      0
      分享至

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

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

      一、什么是 @dataclass

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

      數據類的核心特點:

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

      根據類屬性生成 __init__ 方法。

      (2)自動生成表示方法

      生成 __repr__ 方法,便于調試和日志輸出。

      (3)自動生成比較方法

      可選生成 __eq__、__lt__ 等方法,實現對象比較。

      (4)支持類型提示

      屬性可通過類型注解聲明,增強可讀性和靜態分析能力。

      (5)可選字段控制

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

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

      二、基本用法

      1、定義數據類

          y: float

      自動生成:

      def __eq__(self, other): ...

      2、使用數據類

      print(p1 == p3)    # False

      數據類讓類定義簡潔,代碼可讀性大幅提升。

      三、字段自定義

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

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

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

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

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

      default / default_factory:設置默認值或生成默認值的工廠函數

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

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

      四、裝飾器常用參數

      @dataclass 裝飾器可接收參數控制行為。

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

      order=True

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

      提示:

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

      frozen=True

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

      slots=True(Python 3.10+)

      使用 __slots__ 優化內存和訪問速度,防止動態添加新屬性。

      kw_only=True(Python 3.10+)

      強制使用關鍵字參數初始化,提升代碼可讀性并避免參數順序錯誤:

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

      五、__post_init__ 特殊方法

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

              self.area = self.width * self.height

      提示:

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

      六、典型應用場景

      (1)簡化數據存儲類

      print(r.area())    # 50

      (2)不可變配置對象

      cfg.port = 9090  # 報錯:FrozenInstanceError

      (3)排序與比較

      print(players)    # 按 score 排序

      排序規則默認按字段定義順序進行比較,相當于比較 (score, name)。

      七、與傳統類對比

      特性

      傳統類

      數據類(@dataclass)

      __init__

      手動編寫

      自動生成

      __repr__

      手動

      自動生成

      __eq__

      手動

      自動生成

      排序

      手動

      order=True

      類型提示

      可選

      強烈推薦

      默認值

      手動

      field(default=…)

      數據類主要用于存儲數據,不適合包含大量業務邏輯的方法。對于復雜邏輯,可將數據類與實例方法結合使用。

      八、與其他數據容器的對比

      (1)與 typing.NamedTuple 的對比

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

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

      (2)性能與內存考慮

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

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

      (3)類型檢查器的支持

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

      九、常見誤區

      (1)誤認為數據類字段必須有默認值

      非默認字段必須出現在默認字段之前,否則會報錯:

          b: int = 0  # 正確

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

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

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

      子類繼承數據類時,字段順序和默認值需謹慎,否則可能引發構造函數沖突。

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

      數據類核心目的是簡化數據封裝,邏輯應以實例方法或外部函數實現。

      小結

      @dataclass 裝飾器用于簡化數據類定義,自動生成構造方法、表示方法、比較方法等,提高代碼可讀性與可維護性。結合 field() 可以自定義默認值、比較邏輯及初始化行為。通過 frozen=True、order=True 和 slots=True 等參數,數據類可以支持不可變對象、排序和內存優化。數據類非常適合存儲數據、實現配置對象、排序對象或輕量級結構體,同時保持類型提示和代碼簡潔性。


      點贊有美意,贊賞是鼓勵

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

      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.

      相關推薦
      熱點推薦
      李在明訪華剛回國,就通告全球,與高市共進晚餐,3億大單白簽?

      李在明訪華剛回國,就通告全球,與高市共進晚餐,3億大單白簽?

      愛看劇的阿峰
      2026-01-11 17:30:56
      特朗普稱伊朗已請求進行談判

      特朗普稱伊朗已請求進行談判

      財聞
      2026-01-12 15:19:26
      美國得到格陵蘭島的三種可能路徑:只剩3年任期的特朗普VS千年命運考量的島民

      美國得到格陵蘭島的三種可能路徑:只剩3年任期的特朗普VS千年命運考量的島民

      紅星新聞
      2026-01-09 19:24:42
      名記曝火箭輸球原因:在薩克拉門托找不到酒店住!船記:咋可能

      名記曝火箭輸球原因:在薩克拉門托找不到酒店住!船記:咋可能

      Emily說個球
      2026-01-12 13:04:02
      取代郭士強?男籃或換帥,名帥曝光,加拿大,曾培養多個NBA球星

      取代郭士強?男籃或換帥,名帥曝光,加拿大,曾培養多個NBA球星

      樂聊球
      2026-01-11 15:25:51
      NBA今日里程碑!字母哥歷史第1,庫里超越喬丹,德羅贊26000分

      NBA今日里程碑!字母哥歷史第1,庫里超越喬丹,德羅贊26000分

      世界體育圈
      2026-01-12 13:40:50
      卷走53億!又一大佬帶全家跑路,欠中國銀行20億,投資者血本無歸

      卷走53億!又一大佬帶全家跑路,欠中國銀行20億,投資者血本無歸

      以茶帶書
      2025-12-09 23:33:58
      最討厭的演員排名,潘長江僅第五,閆學晶第二,第一毋庸置疑

      最討厭的演員排名,潘長江僅第五,閆學晶第二,第一毋庸置疑

      林雁飛
      2026-01-04 19:29:51
      “青提”是大陸用語?臺灣一甜品店遭青鳥圍剿,業者緊急發聲

      “青提”是大陸用語?臺灣一甜品店遭青鳥圍剿,業者緊急發聲

      金牛傳音
      2026-01-12 15:36:13
      上梁不正下梁歪?半個月吳秀波迎兩大噩耗,兒子兩年前疑自絕后路

      上梁不正下梁歪?半個月吳秀波迎兩大噩耗,兒子兩年前疑自絕后路

      素衣讀史
      2025-12-17 14:03:31
      陪玩陪睡已過時!拳頭塞嘴、集體開嫖、戚薇遭殃,陰暗面徹底曝光

      陪玩陪睡已過時!拳頭塞嘴、集體開嫖、戚薇遭殃,陰暗面徹底曝光

      涵豆說娛
      2025-11-20 16:35:46
      65歲男人和37歲女人再婚,女人:他老折騰我,男人:夫妻就這樣

      65歲男人和37歲女人再婚,女人:他老折騰我,男人:夫妻就這樣

      惟來
      2026-01-11 13:11:12
      他是道德上的小人,卻是政治上的巨人

      他是道德上的小人,卻是政治上的巨人

      小豫講故事
      2026-01-10 06:00:08
      1972年,毛主席當眾指著她鼻子罵:你男人跟別人好了,你怎么不離婚?

      1972年,毛主席當眾指著她鼻子罵:你男人跟別人好了,你怎么不離婚?

      寄史言志
      2026-01-07 21:08:15
      外媒:英國正為烏克蘭研發可深入打擊俄境內目標的新型彈道導彈

      外媒:英國正為烏克蘭研發可深入打擊俄境內目標的新型彈道導彈

      環球網資訊
      2026-01-12 12:50:37
      俄軍擊落F-16,不可擊落神話破滅,一發打擊,一發補刀

      俄軍擊落F-16,不可擊落神話破滅,一發打擊,一發補刀

      孫餛北漂拍客
      2026-01-12 13:14:26
      中東國家都意識到了:就算中國高端武器再多,也沒辦法保護他們

      中東國家都意識到了:就算中國高端武器再多,也沒辦法保護他們

      肖茲探秘說
      2026-01-01 20:16:34
      1986年陳永貴病逝,追悼會規格成難題,鄧小平只說了一句話,全場安靜

      1986年陳永貴病逝,追悼會規格成難題,鄧小平只說了一句話,全場安靜

      寄史言志
      2026-01-04 16:34:31
      賴清德再無后路,鄭麗文向島內2300萬民眾做保證,特朗普已選邊站

      賴清德再無后路,鄭麗文向島內2300萬民眾做保證,特朗普已選邊站

      博覽歷史
      2026-01-11 18:52:29
      哭老慘了!真燒啊!

      哭老慘了!真燒啊!

      貴圈真亂
      2026-01-12 11:45:52
      2026-01-12 16:04:49
      MediaTea
      MediaTea
      專業的數字媒體、新媒體技術
      1701文章數 72關注度
      往期回顧 全部

      科技要聞

      小米二手車價大跳水:SU7半年跌5萬元

      頭條要聞

      女子坐火車遇71歲初中班主任 被一口叫出名字感動落淚

      頭條要聞

      女子坐火車遇71歲初中班主任 被一口叫出名字感動落淚

      體育要聞

      聰明的球員,不是教練教出來的

      娛樂要聞

      閆學晶:脫離群眾太久 忘了自己的根

      財經要聞

      A股大漲 兩市成交額3.6萬億創歷史新高

      汽車要聞

      增配不加價 北京現代 第五代 勝達2026款上市

      態度原創

      家居
      數碼
      本地
      健康
      公開課

      家居要聞

      包絡石木為生 野性舒適

      數碼要聞

      小米三款新品登陸韓國市場:含充電寶、降噪耳機等

      本地新聞

      云游內蒙|“包”你再來?一座在硬核里釀出詩意的城

      血常規3項異常,是身體警報!

      公開課

      李玫瑾:為什么性格比能力更重要?

      無障礙瀏覽 進入關懷版 主站蜘蛛池模板: 野花韩国高清电影| 波多野结衣一区二区三区高清av| 久久精品噜噜噜成人AV色欲| 亚洲日韩Av中文字幕无码| 91九色国产| 无人区日本高清完整版| 欧美激情精品久久久久久| 亚洲无码五区| 99热国产这里只有精品9| 日韩人妻无码一区二区三区| 亚洲综合一区二区国产精品| 欧美中日韩免费观看网站| 国产高清色高清在线观看| 人妻夜夜爽天天爽三区丁香花| 亚洲video| 久久综合香蕉国产蜜臀av| 亚洲精品国产AV| 无码精品久久一区二区三区 | 2020日韩无码| 乱色熟女人妻字幕一区| 国产精品xxxx| 色狠狠色婷婷丁香五月| 亚洲一区二区约美女探花| 欧美一级黄色影院| 欧美拍拍视频免费大全| 久操视频在线免费观看| 亚洲熟妇久久国产精品| 亚洲AV成人片不卡无码| 青青草大香焦在线综合视频| 扎兰屯市| 一个人在线观看免费中文www| 性色综合| 色噜噜亚洲精品中文字幕| 在线啊V中文字幕| 精品国产网站| 欧美老熟妇精品| 97资源站人妻| 人妻少妇久久| 久久久久无码精品国产AV| 在线观看热码亚洲av每日更新| 国产日韩综合av在线|