[python]数据类(dataclass)简介

这篇具有很好参考价值的文章主要介绍了[python]数据类(dataclass)简介。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


Python3.7引入了dataclass。dataclass装饰器可以声明Python类为数据类;数据类适合用来存储数据,一般而言它具有如下特征:
  • 数据类表示某种数据类型,数据对象代表一种特定类的实体,包含了实体的属性。
  • 同类型的对象之间可以进行比较;如,大于、小于或等于。

数据类定义

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

from dataclasses import dataclass

@dataclass
class A:
  normal: str
  defVal: 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 random

def 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: float

s = [Student("mike", 90),
    Student("steven", 80),
    Student("orange", 70)
    ]
print(sorted(s)) # 只根据score排序

后处理

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

from dataclasses import dataclass

@dataclass
class FloatNumber:
    val: float
    decimal: float = 0
    integer: float = 0

    def __post_init__(self):
        self.decimal, self.integer = math.modf(self.val)

f = FloatNumber(1.2) # decimal与integer自动赋值

dataclasses方法

dataclasses内置属性与方法:文章来源地址https://www.toymoban.com/news/detail-700398.html

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

到了这里,关于[python]数据类(dataclass)简介的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python小知识 - Python装饰器

    Python装饰器 在Python中,装饰器是一个特殊的函数,可以将其他函数包装在装饰器函数中,并且将被包装的函数作为参数传递给装饰器函数。 使用装饰器的好处是可以自动在被包装的函数前后执行一些额外的代码,比如在函数执行前后打印日志,或者在函数执行前后计算函数

    2024年02月09日
    浏览(39)
  • 系统学习Python——装饰器:类装饰器-[初探类装饰器和元类]

    分类目录:《系统学习Python》总目录 函数装饰器是如此有用,以至于Python2.X和Python3.X都扩展了这一模式,允许装饰器应用于类和函数。简而言之,类装饰器类似于函数装饰器,但它们是在一条 class 语句的末尾运行,并把一个类名重新绑定到一个可调用对象。同样,它们可以

    2024年02月19日
    浏览(37)
  • 系统学习Python——装饰器:函数装饰器-[添加装饰器参数:基础知识]

    分类目录:《系统学习Python》总目录 前面文章介绍的计时器装饰器有效运行,但是如果它可配置性更强的话,就会更好一一一例如提供一个输出标签并且可以打开或关闭跟踪消息,这些在一个多用途工具中可能很有用。装饰器参数在这里派上了用场:对它们适当编写后,我们

    2024年02月22日
    浏览(37)
  • 从零开始大数据 2 python简介

    迷失在大数据的海洋?别担心,让我们从零开始!🌊  大数据世界的入口通常需要一把编程的钥匙。选择一门合适的编程语言是你迈向大数据领域的关键一步。Python是大数据处理领域的魔法杖,其简洁易读的语法使其成为数据分析和处理的首选。Java也是大数据处理的重要语

    2024年02月02日
    浏览(32)
  • 大数据教程【05.01】--Python 数据分析简介

    更多信息请关注WX搜索GZH:XiaoBaiGPT 本教程将介绍如何使用Python进行大数据分析。Python是一种功能强大且易于使用的编程语言,具备丰富的数据分析库和工具。在本教程中,我们将涵盖以下主题: 数据分析准备工作 导入数据 数据清洗和预处理 数据探索与可视化 数据分析与建

    2024年02月08日
    浏览(38)
  • python的装饰器详解

    目录 一:介绍 二:在方法中使用 三:在类中使用 四:python自带的装饰器 一:介绍 Python的装饰器是一种高阶函数,它允许你在不改变函数内部逻辑的情况下,给函数添加额外的功能。装饰器本质上是一个接受函数对象作为参数,返回一个新的函数对象的可调用对象(通常是

    2024年01月16日
    浏览(30)
  • 【Python】闭包 | 装饰器

    在函数嵌套的前提下,内部函数使用到了外部函数的变量,并且外部函数返回了内部函数,我们把这个使用外部函数变量的内部函数称为闭包。 需要使用 nonlocal 修饰外部函数的变量才可在内部函数中修改它。 闭包注意事项 优点 无需定义全局变量即可实现通过函数,

    2024年02月09日
    浏览(37)
  • Python闭包与装饰

    闭包与装饰的本质 一个函数的组成部分可以包含: 变量 函数 类 闭包和装饰的本质: 组成部分中的函数引用了组成部分中的其他变量、函数、参数,return该组成部分函数。 闭包 定义:利用nonlocal声明函数组成部分中的变量,返回组成部分中的函数。 实际使用:定义一个函

    2024年01月17日
    浏览(41)
  • python 装饰器

    应用场景

    2024年02月17日
    浏览(30)
  • python装饰器嵌套基础

    python支持装饰器嵌套,即多个装饰器装饰同一个函数或方法。 用法 描述 @a_deco、@b_deco、@c_deco分别占一行,编写在同一个函数或方法的def语句上方。 从def开始,由近到远,依次执行装饰器@c_deco、@b_deco、@c_deco。 等价于 示例 描述 装饰器的包装函数,比如a_wrapper(),保存接收到

    2024年01月25日
    浏览(37)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包