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)
    ]
    

相关内容

热门资讯

常用商务英语口语   商务英语是以适应职场生活的语言要求为目的,内容涉及到商务活动的方方面面。下面是小编收集的常用商务...
六年级上册英语第一单元练习题   一、根据要求写单词。  1.dry(反义词)__________________  2.writ...
复活节英文怎么说 复活节英文怎么说?复活节的英语翻译是什么?复活节:Easter;"Easter,anniversar...
2008年北京奥运会主题曲 2008年北京奥运会(第29届夏季奥林匹克运动会),2008年8月8日到2008年8月24日在中华人...
英语道歉信 英语道歉信15篇  在日常生活中,道歉信的使用频率越来越高,通过道歉信,我们可以更好地解释事情发生的...
六年级英语专题训练(连词成句... 六年级英语专题训练(连词成句30题)  1. have,playhouse,many,I,toy,i...
上班迟到情况说明英语   每个人都或多或少的迟到过那么几次,因为各种原因,可能生病,可能因为交通堵车,可能是因为天气冷,有...
小学英语教学论文 小学英语教学论文范文  引导语:英语教育一直都是每个家长所器重的,那么有关小学英语教学论文要怎么写呢...
英语口语学习必看的方法技巧 英语口语学习必看的方法技巧如何才能说流利的英语? 说外语时,我们主要应做到四件事:理解、回答、提问、...
四级英语作文选:Birth ... 四级英语作文范文选:Birth controlSince the Chinese Governmen...
金融专业英语面试自我介绍 金融专业英语面试自我介绍3篇  金融专业的学生面试时,面试官要求用英语做自我介绍该怎么说。下面是小编...
我的李老师走了四年级英语日记... 我的李老师走了四年级英语日记带翻译  我上了五个学期的小学却换了六任老师,李老师是带我们班最长的语文...
小学三年级英语日记带翻译捡玉... 小学三年级英语日记带翻译捡玉米  今天,我和妈妈去外婆家,外婆家有刚剥的`玉米棒上带有玉米籽,好大的...
七年级英语优秀教学设计 七年级英语优秀教学设计  作为一位兢兢业业的人民教师,常常要写一份优秀的教学设计,教学设计是把教学原...
我的英语老师作文 我的英语老师作文(通用21篇)  在日常生活或是工作学习中,大家都有写作文的经历,对作文很是熟悉吧,...
英语老师教学经验总结 英语老师教学经验总结(通用19篇)  总结是指社会团体、企业单位和个人对某一阶段的学习、工作或其完成...
初一英语暑假作业答案 初一英语暑假作业答案  英语练习一(基础训练)第一题1.D2.H3.E4.F5.I6.A7.J8.C...
大学生的英语演讲稿 大学生的英语演讲稿范文(精选10篇)  使用正确的写作思路书写演讲稿会更加事半功倍。在现实社会中,越...
VOA美国之音英语学习网址 VOA美国之音英语学习推荐网址 美国之音网站已经成为语言学习最重要的资源站点,在互联网上还有若干网站...
商务英语期末试卷 Part I Term Translation (20%)Section A: Translate ...