QZQ的小世界!

  • 首页
你好!
这里是QZQ的博客站!
  1. 首页
  2. 未分类
  3. 正文

Dataclass-数据结构

2025年4月4日 96点热度 0人点赞 0条评论

https://www.python.org/dev/peps/pep-0557

有时候我们需要与一个给定的接口数据对象来交互一些固定结构的数据,为了比较优雅的进行储存,通常的办法是初始化一个数据类,像这样

class Player:
    def **init**(self, name, number, position, age, grade):
        [self.name](http://self.name/) = name
        self.number = number
        self.position = position
        self.age = age
        self.grade = grade

bryant = Player(name='Kobe Bryant', number=24, position='PG', age=22, grade='S')
jordan = Player('Micheal Jordan', 23, 'PG', 29, 'S+')

这种简单的数据类型一般没法给出对象描述(除非继续在class中实现__repr__方法),也没法进行大小比较之类的。并且__init__或多或少有些显得臃肿(需要的属性名出现了三遍)

实际上dataclass完整写出来是这样的

@dataclass(init=``**True**``, repr=``**True**``, eq=``**True**``, order=``**False**``, unsafe_hash=``**False**``, frozen=``**False**``)

这些参数的含义推荐去文档查

Basic

dataclass 可以认为是提供了一个简写__init__方法的语法糖,类型注释是必填项 (不限制数据类型时, 添加typing.Any为类型注释),默认值的传递方式和__init__方法的参数格式一致。

@dataclass
class Data:
    name: Any
    value: Any = 42

另外dataclass支持数据嵌套,并且会检查是否有可变默认参数并进行报错。

还有就是可以实现数据类不可变,只需要添加参数frozen=True即可

@dataclass(frozen=True)
class Data:
    name: Any
    value: Any = 42

data = Data('myname', 99)
data.name = 'other'
>>>
FrozenInstanceError: cannot assign to field 'name'

[文章导入自 http://qzq-go.notion.site/37e426b7216b48fca67a4c608b4760e5 访问原文获取高清图片]

本作品采用 知识共享署名-非商业性使用 4.0 国际许可协议 进行许可
标签: IT技术 Python Python库介绍 Python标准库
最后更新:2025年4月3日

QZQ

一只涉猎广泛的技术爱好者,绝赞养猫中~

点赞
< 上一篇
下一篇 >

归档

  • 2025 年 4 月
  • 2025 年 3 月
  • 2025 年 2 月
  • 2025 年 1 月
  • 2024 年 12 月
  • 2024 年 11 月

分类

  • 技术
  • 未分类

COPYRIGHT © 2024 QZQ的小世界!. ALL RIGHTS RESERVED.

Theme Kratos Made By Seaton Jiang