[python]数据类(dataclass)简介
创始人
2025-05-30 07:25:02
0

文章目录

    • 数据类定义
      • 装饰器
      • field
      • 初始化
      • 数据比较
      • 后处理
    • dataclasses方法

Python3.7引入了dataclass。dataclass装饰器可以声明Python类为数据类;数据类适合用来存储数据,一般而言它具有如下特征:

  • 数据类表示某种数据类型,数据对象代表一种特定类的实体,包含了实体的属性。
  • 同类型的对象之间可以进行比较;如,大于、小于或等于。

数据类定义

就其本质而言,数据类并没有什么特别之处,只是@dataclass装饰器自动生成__repr__,init,__eq__等一系列方法。定义数据类:

from dataclasses import dataclass@dataclass
class A:normal: strdefVal: int = 0

装饰器

dataclass完整形式为(True为生成对应方法,False将不生成;若类中已定义对应方法,则忽略此参数):
@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)

  • init:默认将生成__init__方法;
  • repr:默认将生成__repr__方法;repr字符串包含类名、每个字段名称和其repr(按其类中定义顺序);
  • eq:默认将生成__eq__方法;如果传入False,那么__eq__方法将不会被dataclass添加,但会继承object.__eq__(比较id);
  • order:默认不生成__gt__、__ge__、__lt__、__le__方法;
  • unsafe_hash:如果是False(默认),则根据eq和frozen的设置方式生成__hash__()方法(由内置的hash()使用)。
    • 如果eq和frozen都为真,默认情况会生成一个__hash__()方法;
    • 如果eq为真而frozen为假,则__hash__()将被设置为 None,将其标记为不可散列(确实如此,因为它是可变的);
    • 如果eq为假,则__hash__()将保持不变,这意味着将使用超类的__hash__()方法(如果超类是object,将回退到基于id的散列)。
  • frozen:若为true,实例初始化后属性将无法修改;

field

通过field方法,可定制属性:
dataclasses.field(*, default=MISSING, default_factory=MISSING, repr=True, hash=None, init=True, compare=True, metadata=None)

  • default:如果提供,这将是该字段的默认值。
  • default_factory:用于指定具有可变默认值的字段,必须是一个无参可调用对象;与default互斥(不可同时指定)。
  • init:如果为true(默认值),则该字段作为参数包含在生成的__init__()方法中。
  • repr:如果为true(默认值),则该字段包含在生成的__repr__()方法返回的字符串中。
  • compare:如果为true(默认值),则该字段包含在生成的相等性和比较方法中(__eq__() , __gt__()等等)。
  • hash:可以是布尔值或None:
    • 为None(默认值),则使用compare的值,这通常是预期的行为(不鼓励将此值设置为None以外的任何值);
    • 为true,则此字段包含在生成的__hash__()方法中;
    • 设置hash=False但compare=True(即从hash中排除某个字段,但仍用于比较)的一个可能原因是,计算字段的hash代价很高;
  • metadata:这可以是映射或None;None被视为一个空的字典。这个值包含在MappingProxyType()中,使其成为只读,并暴露在Field对象上(是作为第三方扩展机制提供的)。

使用default_factory生成默认值:

from dataclasses import dataclass, field
import randomdef build_marks() -> list:return [random.randint(0, 1000) for i in range(5)]@dataclass(order=True)
class RandMark:marks: list = field(default_factory=build_marks)r = RandMark() # 使用build_marks生成默认值
print(r)

初始化

通过dataclass装饰器修饰后的类:

  • 无需定义__init__,dataclass会自动处理;
  • 以易读的方式预先定义成员属性(及类型提示);并可定义默认值;
  • dataclass会自动添加一个__repr__函数;

数据比较

通过@dataclass(order = True)可自动添加比较方法(__eq__和__lt__):

  • 比较是通过属性(字段)生成的元组,进行比较的;如上比较元组为(normal, defVale)

通过compare=False,可设定不用于比较的字段:

@dataclass(order=True)
class Student:name: str = field(compare=False)score: floats = [Student("mike", 90),Student("steven", 80),Student("orange", 70)]
print(sorted(s)) # 只根据score排序

后处理

通过__post_init__可做后处理(在__init__返回前,自动调用):

from dataclasses import dataclass@dataclass
class FloatNumber:val: floatdecimal: float = 0integer: float = 0def __post_init__(self):self.decimal, self.integer = math.modf(self.val)f = FloatNumber(1.2) # decimal与integer自动赋值

dataclasses方法

dataclasses内置属性与方法:

  • fields(class_or_instance):返回字段Field对象的元组;
  • asdict(instance, *, dict_factory=dict):将数据类转换为字典,(name:value)对;
  • astuple(instance, *, tuple_factory=tuple):将数据类转换为元组;
  • replace(instance, **changes):创建与instance相同类型的新对象,changes为要修改的值;

相关内容

热门资讯

阿联酋最大银行及另两家中东银行... 观点网讯:5月8日,路透社报道指,阿联酋最大银行第一阿布扎比银行(First Abu Dhabi B...
深圳239亿地王易主,再造万象... 2017年,世茂集团豪掷239.43亿元拿下世茂深港国际中心地块,曾规划建筑高度达700米的深圳第一...
蔚来在安庆成立新能源科技公司 ... 天眼查App显示,近日,安庆蔚来新能源科技有限公司成立,法定代表人为姚蒀,注册资本500万人民币,经...
美国牛肉商期盼峰会重启对华出口 据路透社5月8日报道,美国牛肉生产商正期待特朗普与中国于5月14日至15日的峰会推动对华出口许可恢复...
创业板首家未盈利企业,市值突破... 5月8日,大普微总市值正式突破2000亿元大关。截至午间收盘,大普微涨14.07%,报493.1元/...
招商证券:董事长霍达因工作变动... 招商证券公告,公司董事长霍达因工作变动申请辞去董事长、执行董事等全部职务,辞任自辞呈送达董事会之日生...
原创 中... 【阅读须知】本文所引用的所有信息和数据,均为作者通过查阅官方资料与网络公开数据整理、分析而成,旨在为...
原创 从... 2026年5月5日,中国商务部发布了一项具有划时代意义的专项阻断禁令,这份公告让一向倚仗长臂管辖的美...
布米普特拉北京投资基金管理有限... 美国圣路易斯联邦储备银行总裁穆萨莱姆周三发出明确信号,美联储货币政策面临的潜在风险正在发生关键转向。...
加工的秘密:超精加工设备如何做... 你知道吗? 一根头发丝的直径大约0.07毫米,也就是70微米。 超精加工设备,可切出表面,其尺寸为0...
招商证券董事长霍达因工作变动离... 北京商报讯(记者 刘宇阳 实习生 王思奕)5月8日,招商证券发布关于公司董事长离任暨推举董事代行董事...
华帝股份营收创近3年新低,37... 乐居财经李兰近日,华帝股份(002035.SZ)发布2025年年度报告。 2025年,华帝股份实现营...
大模型融资杀疯了!月之暗面狂揽... 图源:视觉中国 5月7日,据华峰资本官微消息,国内头部大模型公司月之暗面(Kimi)于近日完成新一轮...
扎根长宁二十余载,仲利国际融资... 作为总部扎根上海长宁的优质台资金融企业,仲利国际融资租赁有限公司深耕融资租赁行业二十余载,始终坚守金...
估值210亿!李彦宏又将收获一... 来源:直通IPO,文/王非 国产GPU上市潮仍然汹涌,继两家登陆A股、两家登陆H股后,这家公司正推进...
基金“盲盒”拆了 公募基金正在迎来一场让投资者“看得懂”的变革。 近日,华夏、易方达、南方、招商等12家头部及特色基金...
原创 2... 前言 十年间,中国企业在印尼镍产业链累计砸下超过140亿美元,电厂、公路、码头和全套生产线,硬生生...
原创 欧... 俄罗斯卫星通讯社5月6日报道,欧盟宣布禁止欧洲银行为含有来自不可靠供应商的关键部件的可再生能源项目提...
原创 余... 2026年5月2日,在中国理财市场扎根十三年的余额宝,终于触碰到了一个让所有人错愕的数字——7日年化...
银华基金增聘谭普景共同管理银华... 来源:新浪基金∞工作室 5月8日,银华基金管理股份有限公司发布公告称,为银华中证机器人交易型开放式指...