首页 > 编程语言 >python 标准库 dataclasses 使用指南

python 标准库 dataclasses 使用指南

时间:2024-06-05 13:33:38浏览次数:16  
标签:__ last name dataclasses python Person str 使用指南 id

简单使用

dataclasses 可以用来快速的定义数据类,并能够简单明了的指明该类所具有的属性和类型,比如,要定义一个名为 Person 的类,常规的写法如下:

class Person:

    def __int__(self, id: int, first_name: str, last_name: str, eye_color: str):
        self.id = id
        self.first_name = first_name
        self.last_name = last_name
        self.eye_color = eye_color

如果使用 dataclasses ,写法则会简单很多:

from dataclasses import dataclass

@dataclass
class Person:
    id: int
    first_name: str
    last_name: str
    eye_color: str

dataclasses 将属性都作为类属性定义,不需要再写一遍参数,再写一遍实例属性绑定了,不仅写起来方便,看起来也很清晰。而且在初始化实例时,也会有对应参数的类型提示。

看起来如此简单,那么 dataclasses 还做了哪些其他的工作呢?

数据展示

试着初始化一个实例并看看样子:

>>> john = Person(1, first_name="John", last_name="Doe", eye_color="black")
>>> print(john)
Person(id=1, first_name='John', last_name='Doe', eye_color='black')

可以通过 print 输出的命令同样也很清晰的代表了实例的内容。看来 dataclasses 同时也为 Person 定义了 __str____repr__ 方法。

数据对比

如果再初始化一个实例,并与之前的对比呢?属性不同的话,期望的结果也是不相等的,试试看:

>>> bob = Person(2, first_name="Bob", last_name="Doe", eye_color="black")
>>> print(john == bob)
False

那么如果属性一致,那么期望结果也是相等的:

>>> john2 = Person(1, first_name="John", last_name="Doe", eye_color="black")
>>> print(john2 == john)
True

属性冻结

如果希望生成的实例属性不可变更,可以加入 frozen=True 参数:

@dataclass(frozen=True)
class Person:
    id: int
    first_name: str
    last_name: str
    eye_color: str

此时对实例做属性更改,则会遇到异常:

>>> john = Person(1, first_name="John", last_name="Doe", eye_color="black")
>>> john.last_name = 'Jan'
Traceback (most recent call last):
  File "...", line 20, in <module>
    john.last_name = 'Jan'
  File "<string>", line 4, in __setattr__
dataclasses.FrozenInstanceError: cannot assign to field 'last_name'

定义初始化参数

如果有的参数,只想让它在初始化时传入,但是不要作为实例属性,可以通过 __post_init__ 方法处理,比如,现在想在 Person 的实例化时接收一个 city_id 作为所在城市的数据信息 id,但是在真正调用的时候,希望能够通过 person.city 直接读取到 city_id 所代表的内容。可以这样处理:

from dataclasses import dataclass, InitVar, field


class City(object):
    @classmethod
    def from_id(cls, id):
        return cls()


@dataclass
class Person:
    id: int
    first_name: str
    last_name: str
    eye_color: str
    city_id: InitVar[int]
    city: City = field(init=False)

    def __post_init__(self, city_id: int):
        self.city = City.from_id(city_id)

其他参数

除上述之外, dataclass 装饰器还支持很多定制化的参数,比如 kw_only 是否支持只传入关键字,order 是否支持大于、小于等比较操作,具体可参考官方文档

参考

  1. dataclasses --- 数据类 — Python 3.12.3 文档

标签:__,last,name,dataclasses,python,Person,str,使用指南,id
From: https://www.cnblogs.com/kingron/p/18232802

相关文章

  • Python从0到100(二十九):requests模块处理cookie
    1爬虫中使用cookie为了能够通过爬虫获取到登录后的页面,或者是解决通过cookie的反扒,需要使用request来处理cookie相关的请求1.1爬虫中使用cookie的利弊带上cookie的好处能够访问登录后的页面能够实现部分反反爬带上cookie的坏处一套cookie往往对应的是一个用户......
  • Python数据类型转换(新)
    目录Python数据类型的转换隐式类型转换显式类型转换Python数据类型的转换数据类型分为1.隐式类型转换2.显式类型转换隐式类型转换在隐式类型转换中,Python会自动将一种数据类型转换为另一种数据类型,不需要认为去干预比如在进行算术运算的时候,较低数据类型(整数)就会......
  • Python2 input函数漏洞利用
    在Python2中,input函数相当于eval(raw_input(prompt))如果输入的数据是一个恶意的表达式,存在任意代码执行的风险实例演示字符串拼接命令执行__import__('os').system('cat/etc/passwd')靶场利用在vulnhubbottleneck靶机中,遇到input漏洞利用的情况#核心......
  • Python3基本语法(新)
    目录基本语法输出print()格式化输出标识符import关键字保留字(关键字)注释多行注释1、单引号(''')2、双引号(""")缩进空行同一行显示多条语句等待用户输入inputimport与from...import基本语法输出print()print()是一个让计算机在屏幕上进行输出的'指令'.它分为四个部分1.prin......
  • Python数据类型(新)
    目录数据类型类型查看同时多个变量赋值标准数据类型1.数字(Number)2.字符串3.bool(布尔类型)4.元组元组的运算+运算+=运算*运算元组的删除5.列表(List)查找列表修改列表列表的切片列表是可以修改的列表的追加列表的插入列表的连接列表的删除列表的清空列表的复制6.字典查找字典......
  • 基于Python混沌系统和DNA编码的图像加密算法
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景随着互联网和多媒体技术的快速发展,数字图像作为信息传递的重要媒介,在各个领域得到广泛应用。然而,图像信息的传输......
  • 基于Python+OpenCV使用DNA编码和混沌图创建图像加密算法
    欢迎大家点赞、收藏、关注、评论啦,由于篇幅有限,只展示了部分核心代码。文章目录一项目简介二、功能三、系统四.总结一项目简介  一、项目背景与意义在数字信息时代,图像作为信息的重要载体,其安全性尤为重要。传统的图像加密方法往往存在安全性不足、加密效......
  • python数据分析案例-研究生成绩分析
    一、简介在本次研究中,我们对2018年硕士生考试成绩数据进行了深入的统计分析。这项分析旨在探索不同因素如性别、生源背景、基因型以及出生月份等对学生成绩的潜在影响。我们使用了一系列的统计方法,包括描述性统计分析、相关性分析、分组分析以及方差分析(ANOVA),以获得对这些数据......
  • python学习 - 通过OpenCV库识别视频、图片画面等来捕捉人脸信息等
    #-*-coding:utf-8-*-#import进openCV的库importcv2importos#调用摄像头检测人脸并截图defCatchPICFromVideo(window_name,path_name):cv2.namedWindow(window_name)#视频来源,可以来自一段已存好的视频,也可以直接来自USB摄像头cap=cv2.......
  • Python实例:仅绘制图例而不绘制实际的图形
    Python实例:仅绘制图例而不绘制实际的图形作者:凯鲁嘎吉-博客园 http://www.cnblogs.com/kailugaji/Python实例:仅绘制图例而不绘制实际的图形,使用线条来表示不同的数据系列(即使这些数据系列在图中没有实际表示)。#Python实例:仅绘制图例而不绘制实际的图形#使用线条来表示不......