python之dataclasses
创始人
2024-05-30 18:02:45
0

一、场景

dataclasses模块提供了一种方便的方法来创建和管理数据对象
它可以帮助开发者更容易地创建简单的类,同时提供了一些实用的功能,例如自动实现__init__()、repr()、eq()等方法。

  • 数据容器:如果您需要一个简单的类来存储一些数据,例如配置信息、用户信息、数据记录等,那么使用dataclass是非常合适的。dataclass可以自动为您生成适当的属性和方法,以便您可以轻松地访问和修改数据。

  • 数据对象:如果您的代码需要处理大量的数据对象,例如在数据分析、机器学习、自然语言处理等领域中,那么使用dataclass可以使代码更加清晰易读,减少手动编写大量的属性和方法的重复性工作。

  • 序列化和反序列化:dataclass可以帮助您更轻松地将对象序列化为JSON、XML等格式,并在需要时将其反序列化。这使得处理不同系统之间的数据交换变得更加容易。

  • 数据验证和清理:在某些情况下,您可能需要在将数据存储到数据库或发送到其他系统之前对其进行验证和清理。使用dataclass可以使这个过程更加简单和可靠。

二、基础用法

from dataclasses import dataclass, field, asdict, astuple
from typing import List, Any@dataclass
class Book:name: strauthor: str# extend: Any = 'hello world'   # 扩展字段 仅做记录publication: str = field(metadata={"description": "出版日期"})num: int = field(default=1, metadata={"description": "数量"})price: float = field(default=0.0, metadata={'currency': 'RMB'})category: List[str] = field(default_factory=list, repr=False, metadata={"description": "图书类别"})def __post_init__(self):# 方法来确保书名的每个单词的首字母都是大写的self.name = self.name.title()self.title = self.name.upper()def is_expensive(self):# 检查一本书是否价格高于100return self.price > 30.0def total_amount(self):return self.price * self.num
  • 如何调用
    book = Book(name="Under the sky", author="sanxian", price=37.82, publication="2022-11-07", category=['武侠', '古风'])
    book = Book(**{"name": "the three body problem", "author": "刘慈欣", "price": 37.82, "publication": "2022-12-23", "category": ['科幻', '悬疑']})
    print(book.name, book.author)
    print(book.title)print(book.is_expensive())
    print(book.total_amount())book.price = 27.5  # 修改价格属性
    print(book.is_expensive())  # 输出:Trueprint(asdict(book))
    print(astuple(book))
    
    The Three Body Problem 刘慈欣 2022-12-23 37.82
    THE THREE BODY PROBLEM
    True
    37.82
    False
    {'name': 'The Three Body Problem', 'author': '刘慈欣', 'publication': '2022-12-23', 'num': 1, 'price': 27.5, 'category': ['科幻', '悬疑']}
    ('The Three Body Problem', '刘慈欣', '2022-12-23', 1, 27.5, ['科幻', '悬疑'])
    

三、中级用法

  • 装饰器参数 dataclasses.dataclass(*, init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)

    参数名称默认值是否生成方法说明
    initTrue__init__是否生成 __init__ 方法
    reprTrue__repr__是否生成 __repr__ 方法
    eqTrue__eq__是否生成 __eq__ 方法
    orderFalse<, <=, >, >=是否生成比较方法
    unsafe_hashFalse__hash__是否生成 __hash__ 方法
    frozenFalse不可变类是否生成不可变类
  • init 参数控制是否生成 init 方法。当设置为 True 时,会自动生成 init 方法;当设置为 False 时,不会生成 init 方法。

    @dataclass(init=False)
    class Person:name: strage: intdef __init__(self, name: str, age: int):self.name = nameself.age = agep = Person("zhangsan", 30)
    print(p.name) # 输出: Alice
    print(p.age)  # 输出: 30
    

    init 被设置为 False,dataclass 不会自动生成 init 方法
    init 被设置为 True(即默认),该方法接收两个参数 name 和 age,并将存储在实例属性 self.name 和 self.age 中

  • frozen控制是否创建一个冻结的数据类,即该类的实例在创建后就不可变

    from dataclasses import dataclass@dataclass(frozen=True)
    class Point:x: inty: intp = Point(1, 2)
    p.x = 3  # 会引发 AttributeError: can't set attribute
    

四、其它用法

  • field 支持的参数

    参数描述默认值
    default字段的默认值
    default_factory返回字段初始值的函数
    init是否在._init_()方法中使用字段True
    repr是否在._repr_()方法中使用字段True
    compare是否在比较对象时, 包括该字段True
    hash计算hash时, 是否包括字段True
    metadata包含字段信息的映射
  • compare 默认指定比较,则各个属性依次次进行比较
    注释:下面仅用年龄进行排序或者排序

    @dataclass(order=True)
    class Person:name: str = field(compare=False)age: int = field(compare=True)height: float = field(compare=False)p1 = Person(name="A-zhangsan", age=25, height=156)
    p2 = Person(name="B-lisi", age=18, height=173)
    p3 = Person(name="C-wanger", age=20, height=168)print(p2 > p1)  # 输出 True
    print(sorted([p1,p2, p3]))  # 输出按薪资排序的 Person 对象列表
    
    False
    [Person(name='B-lisi', age=18, height=173), Person(name='C-wanger', age=20, height=168), Person(name='A-zhangsan', age=25, height=156)
    ]
    

相关内容

热门资讯

运动会致辞 运动会致辞(精选5篇)  无论在学习、工作或是生活中,大家或多或少都用到过致辞吧,致辞要求风格的雅、...
六一儿童节的主持稿 六一儿童节的主持稿(精选8篇)  随着社会一步步向前发展,我们都不可避免地要接触到主持稿,主持稿是主...
元旦文艺汇演主持稿 元旦文艺汇演主持稿范文(通用5篇)  在当下社会,很多情况下我们需要用到主持稿,主持稿起到承上启下的...
颁奖主持词 颁奖主持词三篇  主持人在一场活动中是十分重要的,一个好的主持人是一直带动着活动过程中的气氛,让大家...
婚宴答谢宴简短主持词 婚宴答谢宴简短主持词  主持词要根据活动对象的不同去设置不同的主持词。在人们积极参与各种活动的今天,...
汽车公司庆典主持词 汽车公司庆典主持词  利用在中国拥有几千年文化的诗词能够有效提高主持词的感染力。现今社会在不断向前发...
古筝音乐会主持词 古筝音乐会主持词6篇  主持词要把握好吸引观众、导入主题、创设情境等环节以吸引观众。在一步步向前发展...
小学元旦联欢会主持词开场白和... 小学元旦联欢会主持词开场白和结束词  根据活动对象的不同,需要设置不同的主持词。随着社会一步步向前发...
知识竞赛主持词 知识竞赛主持词(精选6篇)  主持词的写作需要将主题贯穿于所有节目之中。在人们越来越多的参与各种活动...
小学家长会学生欢迎词 小学家长会学生欢迎词小学家长会学生欢迎词文章标题:小学家长会学生欢迎词家长会欢迎辞亲爱的叔叔阿姨,爷...
消夏晚会主持词 2017消夏晚会主持词  漫漫暑假,天气越来越燥热,不妨在炎热的午后,参加一场纳凉晚会,欣赏社区带来...
周立波脱口秀台词 周立波脱口秀台词集锦四十岁之前喝酒是为了别人的一句~~厉害!醉了!!四十岁以后喝酒是为了自己的一句~...
圣诞节活动主持词节目串词 圣诞节活动主持词节目串词3篇  根据活动对象的不同,需要设置不同的主持词。在人们积极参与各种活动的今...
生日华诞主持词 生日华诞主持词范文各位领导,各位朋友,各位来宾,女士们,先生们:  中午好。  今天是个喜庆的日子,...
学术会议主持词 学术会议主持词  什么是主持词  由主持人于节目进行过程中串联节目的串联词。如今的各种演出活动和集会...
订婚仪式及主持词 订婚仪式及主持词范文(通用3篇)  活动对象的不同,主持词的写作风格也会大不一样。在现在的社会生活中...
古剑奇谭欧阳少恭经典台词参考 古剑奇谭欧阳少恭经典台词参考  大型古装玄幻剧《古剑奇谭》正在湖南卫视热播,剧中,乔振宇饰演温文尔雅...
幼儿园晨会主持词 幼儿园晨会主持词  美好的一天从早上开始,从晨会开始,从大家的好的状态开始,从最好的开始。以下是小编...
诗文诵读展示主持词 诗文诵读展示主持词  主持词没有固定的格式,他的最大特点就是富有个性。在当今不断发展的世界,很多晚会...