Python中的数据类dataclass详解

python:dataclasses --- 数据类 阅读详情
AI摘要

本文探讨了从基本数据类型到Python内置的命名元组和自定义类,直至dataclass的演变过程,重点讲解了如何解决数据属性控制、可读性、可修改性和比较功能的问题,并展示了dataclass的强大之处,如类型提示、默认值和不可变性。

1. 为什么需要数据类

1.1 ☹️内置数据类型的局限

假设我们现在遇到一个场景, 需要一个数据对象来保存一些运动员信息.

可以选择使用基本的数据类型tuple或者dict实现. 如:创建一个球员jordan, 信息包括球员姓名, 号码,  位置, 年龄.

使用tuple

In [1]: jordan = ('Micheal Jordan', 23, 'PG', 29)
In [2]: jordan[0]
Out[2]: 'Micheal Jordan'

劣势: 创建和取值基于位置,  需要记住坐标对应的信息. 

 使用dict

In [3]: jordan = {'name': 'Micheal Jordan', 'number': 23, 'position': 'PG', 'age': 29}
In [4]: jordan['position']
Out[4]: 'PG'

使用字典之后, 获取信息时会相对直观, 但是相较于字典的括号语法 jordan["position"] 我们更希望可以用类似获取属性一样使用 jordan.postion. 

 劣势: 无法对数据属性名进行控制,

少值或者错值,如, jordan = {'name': 'Micheal Jordan', 'NUMBER': 23} 一样可以创建成功.

1.2 😐使用命名元组 namedtuple

为了解决这种问题, python 中的 collections 模块提供一个命名元组, 可以使用点表示法和字段名称访问给定命名元组中的值.  使用namedtuple代码如下:

In [5]: from collections import namedtuple

In [6]: Player = namedtuple('Player', ['name', 'number', 'position', 'age', 'grade'])
In [7]: jordan = Player('Micheal Jordan', 23, 'PG', 29, 'S+')

In [8]: jordan
Out[8]: Player(name='Micheal Jordan', number=23, position='PG', age=29, grade='S+')

使用namedtuple之后

    ① 可以使用 '.'语法获取数据的属性, 可以限制数据的属性名称,

    ② 创建对象时数据不匹配会报错.

In [9]: jordan.number
Out[9]: 23

In [10]: bryant = Player('Kobe Bryant', 24, 'PG')
---------------------------------------------------------------------------
TypeError: __new__() missing 2 required positional arguments: 'age' and 'grade'

1.2.1 namedtuple的不足

对于一些字段比较少的数据结构, namedtuple是一个非常好的解决方案. 但面对一些复杂的数据的时候, 需要更多的功能时, namedtuple就无法满足了.

In [11]: bryant = Player('Kobe Bryant', 24, 'PG', 22, 'S')
In [12]: bryant.age=23
---------------------------------------------------------------------------
AttributeError: can't set attribute

劣势:① 数据无法修改

        ② 无法自定义数据比较,  没有默认值, 没有函数支持.

1.3 🙂自定义类 Class

为了支持数据修改, 默认值, 比较等功能. 更加好一些的方法是, 使用自定义类来实现数据类. 一个最简单的数据类代码如下:

In [13]: class Player:
    ...:     def __init__(self, name, number, position, age, grade):
    ...:         self.name = name
    ...:         self.number = number
    ...:         self.position = position
    ...:         self.age = age
    ...:         self.grade = grade

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

可以使用位置参数或者键值参数创建对象

In [16]: bryant.position='SF'
In [17]: bryant.position
Out[17]: 'SF'

可以看到, 数据类可以支持对属性的修改,

In [18]: bryant
Out[18]: <__main__.Player at 0x29446d401c8>

问题①:目前的实现 对于对象的描述不太友好,


In [19]: jordan > bryant
---------------------------------------------------------------------------
TypeError: '>' not supported between instances of 'Player' and 'Player'

问题②:数据还不支持比较. 

为了解决上面两个问题,可以通过实现 __repr__ 方法来自定义描述, 实现 __gt__ 方法来支持比较的功能. 更新代码如下:

In [20]: class Player:
    ...:     def __init__(self, name, number, position, age, grade):
    ...:         self.name = name
    ...:         self.number = number
    ...:         self.position = position
    ...:         self.age = age
    ...:         self.grade = grade
    ...:     def __repr__(self):
    ...:         return f'Player: \n {self.name}\t #{self.number}\t @{self.position}\t <{self.grade}>'
    ...:     def __eq__(self, other):
    ...:         return self.age == other.age
    ...:     def __gt__(self, other):
    ...:         return self.age > other.age
    ...:     def swing(self, pos):
    ...:         self.position = pos

In [21]: jordan = Player('Micheal Jordan', 23, 'PG', 29, 'S+')
In [22]: bryant = Player('Kobe Bryant', 24, 'PG', 22, 'S')

In [23]: jordan
Out[23]:
Player:
 Micheal Jordan  #23     @PG     <S+>

In [24]: jordan > bryant
Out[24]: True

In [25]: jordan.swing('SF')
In [26]: jordan
Out[26]:
Player:
 Micheal Jordan  #23     @SF     <S+>

可以看到数据对象有了更直观的描述, 支持了对比 (若要支持 >= 的对比, 还需要自定义 __ge__方法). 还可以自定义方法swing来改变球员打的位置.

劣势:① __init__方法中重复代码 (示例中每个属性都需要写3遍)

        ② 需要自己实现__repr__方法, 和比较方法__eq__, __gt__等

1.4 😃数据类 dataclass 

主角出场了, 数据类是Python3.7 开始引入的一个新功能, 数据类提供了开箱即用的方法来创建自定义数据, 可以直接实例化、打印和比较数据类实例.

In [1]: from dataclasses import dataclass

In [2]: @dataclass
   ...: class Player:
   ...:     name: str
   ...:     number: int
   ...:     position: str
   ...:     age: int
   ...:     grade: str

In [3]: james = Player('Lebron James', 23, 'SF', 25, 'S')
In [4]: james
Out[4]: Player(name='Lebron James', number=23, position='SF', age=25, grade='S')

2. dataclass 的使用

2.1 类型提示和默认值

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

In [1]: from dataclasses import dataclass
In [2]: from typing import Any

In [3]: @dataclass
   ...: class Data:
   ...:     name: Any
   ...:     value: Any = 42

2.2 数据嵌套

数据类可以嵌套为其他数据类的字段,  可以简单创建一个有2个队员的球队.lal包含两名球员 james和davis

In [1]: from dataclasses import dataclass
In [2]: from typing import List

In [3]: @dataclass
   ...: class Player:
   ...:     name: str
   ...:     number: int
   ...:     position: str
   ...:     age: int
   ...:     grade: str

In [4]: @dataclass
   ...: class Team:
   ...:     name: str
   ...:     players: List[Player]

In [5]: james = Player('Lebron James', 23, 'SF', 25, 'S')
In [6]: davis = Player('Anthony Davis', 3, 'PF', 21, 'S-')

In [7]: lal = Team('Los Angeles Lakers', [james, davis])
In [8]: lal
Out[8]: Team(name='Los Angeles Lakers', players=[Player(name='Lebron James', number=23, position='SF', age=25, grade='S'), Player(name='Anthony Davis', number=3, position='PF', age=21, grade='S-')])

2.3 dataclasses中的field

当我们尝试使用可变的数据类型, 给数据类中做默认值时, 触发了python中的大坑之一 使用可变默认参数, 导致多个实例公用一个数据从而引发bug. dataclass 默认阻止使用可变数据做默认值

In [9]: @dataclass
   ...: class Team:
   ...:     name: str
   ...:     players: List[Player] = [james]
---------------------------------------------------------------------------
ValueError: mutable default <class 'list'> for field players is not allowed: use default_factory

就像错误提示中的, 处理此种场景时, 需要使用 field 中的 default_factory .

In [10]: from dataclasses import field

In [11]: @dataclass
    ...: class Team:
    ...:     name: str
    ...:     players: List[Player] = field(default_factory=lambda :[james])

In [12]: nyk = Team('New York Knicks')
In [13]: nyk
Out[13]: Team(name='New York Knicks', players=[Player(name='Lebron James', number=23, position='SF', age=25, grade='S')])
field 支持的参数
参数描述默认值
default字段的默认值
default_factory返回字段初始值的函数
init是否在.__init__()方法中使用字段True
repr是否在.__repr__()方法中使用字段True
compare是否在比较对象时, 包括该字段True
hash计算hash时, 是否包括字段True
metadata包含字段信息的映射

 2.4 不可变数据类

要使数据类不可变,需要在创建类时设置frozen=True。

In [1]: from dataclasses import dataclass
In [2]: from typing import Any

In [3]: @dataclass(frozen=True)
   ...: class Data:
   ...:     name: Any
   ...:     value: Any = 42

In [4]: data = Data('myname', 99)
In [4]: data.name = 'other'
---------------------------------------------------------------------------
FrozenInstanceError: cannot assign to field 'name'

总结:

dataclass 提供一个简便的方式创建数据类, 默认实现__init__(),  __repr__(),  __eq__()方法.

dataclass支持数据类型的嵌套

支持将数据设置为不可变

Python中的数据类(dataclass):简化类的定义与数据管理的全面指南 Python 3.7引入的数据类(dataclass)极大地简化了类的定义,尤其在处理数据管理任务时。数据类自动生成__init__、__repr__等方法,帮助开发者避免重复性代码,提高了代码的简洁性和可读性。本文将深入讲解数据类的用法,包括如何使用Python的dataclasses模块定义数据类、默认参数、类型注解、字段排序、方法重写等内容。我们还将通过丰富的代码示例,展示数据类在实际项目中的应用,帮助开发者高效管理和操作数据。 阅读详情

相关推荐

Python入门:掌握 Python @dataclass,快速创建高效的数据类!

Python入门:掌握 Python @dataclass,快速创建高效的数据类!

XiaoqiangClub的博客 362

【python】一文带你了解什么是dataclass?

通过对field()对象的剖析,我们可以指定属性:是否参与比较,是否参与hash计算等等。不过我们知道默认的比较顺序,我们也可以通过增加属性以实现按需比较的功能。而这个用于比较的属性位于数据类的第一个属性,并可以借助魔法函数实现灵活赋值。sort_index: tuple = field(init=False) # 添加一个 sort_index 字段,并设置为不在 __init__ 方法中初始化name: strgrade: str。

海哥python的博客 2799

[Python] 使用 dataclass 简化数据结构:定义、功能与实战

本文介绍Python3.7引入的@dataclass装饰器,它能自动生成__init__()、repr()等常见方法,简化面向对象编程中的样板代码。

每日出拳老爷子的博客 189

[python]数据类(dataclass)简介

介绍了数据类装饰器dataclasses,和field的用法;以及如何自定义数据类比较和后处理

飞鹰技术 5179

Python中dataclass库:简化数据类的创建和管理

Python中dataclass库:简化数据类的创建和管理Python是一种功能强大、易于学习和使用的编程语言,广泛应用于各个领域的开发。在Python的标准库中,有一个非常有用的库叫做,它提供了一种简化创建和管理数据类的方式。数据类是用于存储数据的类,通常包含属性和方法来操作这些数据。在本文中,我们将介绍库的基本概念、用法和示例代码。首先,让我们来了解一下库的基本概念。是Python 3.7中引入的一个装饰器,它允许开发者以一种更简洁的方式定义数据类。使用装饰器,我们可以自动为数据类生成一些通用的方法,如

. 407

RT-Thread网络编程:基于STM32F407的TCP客户端实现(含完整代码解析)

本文详细介绍了在STM32F407平台上,基于RT-Thread操作系统和LWIP协议栈实现工业级可靠TCP客户端的完整过程。内容涵盖底层ETH驱动配置、Socket编程、连接保活与断线重连机制、数据收发协议设计以及资源管理,提供了可应用于实际项目的健壮代码框架与调试技巧。

weixin_29184371的博客 492

python5.1 数据类dataclass

OOP再补充

weixin_62528784的博客 1505

AD9361数字调制入门:从IQ调制原理到动手实现第一个ASK信号(Vivado工程详解)

本文详细介绍了如何使用AD9361射频收发器实现ASK数字调制,从IQ调制原理到Vivado工程实现。通过Verilog代码示例和FPGA架构设计,帮助开发者理解纯逻辑实现数字调制解调的关键技术,特别适合软件无线电(SDR)初学者入门实践。

weixin_29158047的博客 374

python 什么是数据类dataclass,以及它的应用场景

python 什么是数据类dataclass,以及它的应用场景

weixin_44638453的博客 1556

2023东华大学机试OJ进阶版1-81题

先排序。每次找两个最小的数,把其中一个置为两数之和,并累加这个和值,另一个数置为-1,然后再排序,重复操作,直到只剩下一个数。105。

m0_49263811的博客 2796

C语言 100道经典编程题适用于专升本,专接本【详细分析版】_c语言专升本题目

/法2//left指向起始 right指向数组末尾= 0){left++;//如果*left是奇数就循环接着向后指,直到指向偶数就退出//(left

2401_84978503的博客 695

Python 数据类(dataclass)全面详解:从入门到精通

本文系统讲解了 Python 的 dataclass 装饰器,包括其功能、优势及应用场景。通过示例展示如何使用 dataclass 简化类定义、设置默认值、实现不可变类及序列化操作,让代码更简洁高效。

Xianxiancq的博客 1739

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

基于Pycatia的智能孔特征识别技术:无参模型圆心自动化提取方案

KE17RS的博客 2877

[python] dataclass 快速创建数据类

在Python中,dataclass是一种用于快速创建数据类的装饰器和工具。自Python 3.7起,通过标准库中的dataclasses模块引入。它的主要目的是简化定义类来仅存储数据的代码量。通常,这样的类包含多个初始化属性,但没有复杂的方法(尽管你可以添加方法)。使用dataclass装饰器,Python会自动为你生成一些特殊方法,如__init__()、__repr__()、__eq__()等。

言之。 1万+

股票价格预测的秘密武器:用C#实现蒙特卡洛路径模拟,轻松掌握市场波动规律!

摘要: 蒙特卡洛模拟是股票预测的有效工具,通过随机抽样模拟价格路径,克服传统技术分析的局限性。其核心模型是几何布朗运动(GBM),描述股价随机变化过程。C#实现的关键步骤包括:1)获取输入参数;2)生成随机数路径;3)分析结果。该方法不预测具体价格,而是提供可能的价格范围,帮助投资者评估风险。代码结构清晰,分为输入、模拟、分析和可视化四个模块,通过参数封装提高可读性,适用于不确定市场的概率预测。

墨夶的博客 601

【PyTorch】CNN(一维卷积Conv1D)实现时间序列预测

本文介绍了一维卷积神经网络(Conv1D)在时间序列预测中的应用,展示了其基本原理及实现方式。通过合适的数据预处理和模型调参,Conv1D可以有效地捕捉时间序列数据中的模式,从而进行精准预测。

走向CTO的路上... 1173

Python 数据类(dataclass)的使用与源码解析

简单来说,dataclass 是一种装饰器,它可以自动为类生成一些常用的方法,如 `__init__()`、`__repr__()` 和 `__eq__()` 等。这使得我们无需手动编写这些方法,从而减少了代码量并提高了代码的可读性。dataclass 是 Python 中一个强大且简洁的工具,它极大地简化了类的定义过程。通过本文的介绍,你应该对 dataclass 的使用以及其背后的实现机制有了更深的理解。希望你能将这一知识应用到自己的项目中,提高开发效率。```

2501_91226726的博客 777

Python 爬虫实战:网站反爬机制绕过终极指南(技术原理 + 实战代码 + 避坑技巧)

在 Python 爬虫的世界里,反爬机制是每一个爬虫开发者都必须面对的挑战。网站为了保护自身数据不被恶意爬取,会设置各种反爬机制,这使得爬虫开发变得更加复杂和有趣。本文将详细介绍常见的网站反爬机制及其绕过方法,结合技术原理、实战代码和避坑技巧,帮助你成为一名优秀的爬虫开发者。

u014481728的博客 1005

Python 数据类(dataclass)的底层实现与优化

dataclass 是 Python 3.7 引入的一个模块,位于标准库中的模块中。它的主要目的是减少样板代码的编写,特别是在处理包含大量字段的数据类时。通过使用 @dataclass 装饰器,开发者可以避免手动编写 __init__、__repr__ 等方法,从而专注于业务逻辑。dataclass 是 Python 中一项非常实用的功能,它极大地简化了数据类的定义过程。通过对装饰器的工作原理进行深入分析,我们可以更好地理解其背后的实现细节。

2501_91164829的博客 962

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Python基础篇(十四)-- 数据类dataclass使用指南

从 Python3.7 版本开始,引入了一个新的模块dataclasses,该模块主要提供了一种数据类的实现方式。基于PEP-557实现。 所谓数据类,类似 C++里的 plain struct,Java 语言中的 Bean。通过一个容器类(class),继而使用对象的属性访问数据。如果你使用过标准库中的collections.namedtuple,或者 typing.NamedTuple,dataclasses是与这两者类似的。

CarpeDiem 6526

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

Python进阶:数据类(dataclasses.dataclass)简化代码

本文介绍了Python中dataclasses.dataclass的核心概念与实践应用。通过数据类可以简化代码结构,自动生成常见方法如__init__、__repr__等。文章从基本用法入手,展示了如何定义数据类、设置默认值和类型提示,并详细解析了其技术原理和实现机制。实践部分包含基础到进阶的代码示例,如类定义、数据处理和面向对象编程。最后针对常见环境配置问题提供了解决方案,帮助开发者高效使用这一特性提升Python开发效率。

未来 95% 的 AI 应用将变得隐形,广泛融入日常生活。 6121

【Python高阶编程技术】第9篇 数据类深度剖析:dataclass、slots 与 immutability

摘要: Python数据类深度解析:@dataclass通过动态代码生成简化样板代码,slots=True可节省47%内存(实测100,000实例从55MB降至29MB)。frozen=True实现不可变对象,需配合unsafe_hash=True保证哈希安全,适用于并发/缓存场景。领域模型建议采用"不可变数据类+可变ORM"分层设计,注意避免嵌套可变对象的陷阱。最佳实践包括:默认使用default_factory、热路径启用slots、通过__post_init__强化不变性检查。

1084

python进阶(7):dataclass数据类使用

Python3.7引入了dataclass。dataclass装饰器可以声明Python类为数据类;数据类表示某种数据类型,数据对象代表一种特定类的实体,包含了实体的属性。同类型的对象之间可以进行比较;如,大于、小于或等于。dataclass与普通类的区别与普通类相比,dataclass通常不包含私有属性,这些属性可以直接访问(也可以私有);repr() 函数将对象转化为供解释器读取的形式;dataclass的repr方法通常有其固定格式,会打印类名、属性名、属性值;

u013938578的博客 607

python概述_理解Python数据类:Dataclass 的特征概述 (上)

原标题Understanding Python Dataclasses—Part 1,作者为 Shikhar Chauhan 。 这是一个包含两部分的博文:这一篇是 Dataclass 的特征概述下一篇是 Dataclass fields 的概述引言Dataclasses 是一些适合于存储数据对象(data object)的 Python 类。你可能会问,什么是数据对象?下面是一个并不详尽的用于定...

weixin_39875842的博客 258
上一篇: Python中的包和模块 module, package
下一篇: Python 中的json模块dumps参数详解
be5yond
博客等级 码龄10年 590粉丝 123原创
评论 8
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值