简介

根据定义dataclass时指"一个带有默认值的可变的namedtuple"

简单来说,就是你定义一个很普通的类,@dataclass装饰器可以

帮你生成__repr__、__init__等方法,就不用自己写一遍了。但是

此装饰器返回的依然是一个class类,这意味着并没有带来任何不便,

你依然可以使用继承、metaclass、docstring、定义方法等。

示例,解决实例化,__init__参数过多时的问题

from dataclasses import dataclass
@dataclass
class InventoryItem:
name: str
unit_price: float
quantity_on_hand: int = 0 # 默认值为0 def total_cost(self) -> float:
return self.unit_price * self.quantity_on_hand

上面的代码会自动帮我们生成__init__初始化方法

示例,优雅的方式表示嵌套

from dataclasses import dataclass
from typing import List @dataclass
class Player:
name: str
number: int
position: str
age: int @dataclass
class Team:
name: str
players: List[Player] james = Player('jack', 23, 'SF', 25)
james = Player('Nick', 3, 'PF', 21) lal = Team([james, davis])
print(lal.name, lal.players)

示例,对象初始化后禁止改变

from dataclasses import dataclass
from typing import Any @dataclass(forzen=True) # 这个参数在对象初始化后,会禁止更改值
class Data:
name: Any
value: Any = 42 data = Data('my_name', 99)
data.name = 'other' # 报错

示例,使用工厂函数为属性的默认值定义为空列表

from dataclasses import dataclass, field
from typing import List @dataclass
class C:
my_list: List[int] = field(default_factory=list) c1 = C()
c1.my_list += [1,2,3]
c2 = C()

示例,使用field不初始化某个属性的值(因为默认的会初始化每个属性的值)

from dataclasses import dataclass, field
@dataclass
class C:
a: float
b: float
c: float = field(init=False) # 告诉dataclass先不初始化成员变量c c1 = C(10, 20)
print(c1.a, c1.b)

介绍field

通过上面的两个例子,我们认识到了field的两个作用:

在初始化可变默认值(mutable default) 情况下,必须要通过field的默认工厂函数来进行声明。

可以通过field来控制某一个成员变量是否被初始化。

下面我们详细介绍一下field的工作流程。

dataclass装饰器的工作流程:

如果不单独调用field方法,dataclass装饰器就对被dataclass装饰的对象中的每个成员变量(按照上述函数原型中的默认值)执行操作

因为上面的默认值中init=True,所以默认情况下,被dataclass装饰的对象中的所有成员变量会执行init操作。

因为上面的默认值中default=MISSING,所以默认情况下,被dataclass装饰的对象中的所有成员变量没有默认值。

因为上面的默认值中default_factory=MISSING,所以默认情况下,被dataclass装饰的对象中的所有成员变量没有默认的工厂函数。

如果想要控制被dataclass装饰的对象中的每个成员变量的具体执行动作,可以在成员变量构造的时候,设置单独的field方法

比如不想初始化某一个成员变量,就可以将field方法设置为init=False。 这就是上面的3.1.2. 章节的内容

也可以通过field方法设置某一个成员变量的默认值,但是这样有点大材小用了。

特殊的__post_init__方法

类在初始化的时候传入了两个值(或者多个值),但是根据这两个值会自动可以确认第三个值,我不希望再单独调用后生成第三个值。
即: 我期望在我给初始化传入两个值后,完成初始化动作后,第三个值自动生成了。
from dataclasses import dataclass, field
@dataclass
class C:
a: float
b: float
c: float = field(init=False) def __post_init__(self):
self.c = self.a + self.b c1 = C(10,20)
print(c1) # c1:C(a=10, b=20, c=30)

dataclass装饰器的更多相关文章

  1. Python 3.7 将引入 dataclass 装饰器

    简评:Python 3.7 将于今年夏天发布,Python 3.7 中将会有许多新东西,最激动人心的新功能之一是 dataclass 装饰器. 什么是 Data Class 大多数 Python 开发 ...

  2. Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数

    1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...

  3. Python 装饰器入门(下)

    继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...

  4. Python高手之路【四】python函数装饰器

    def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...

  5. python装饰器

    今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...

  6. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  7. [原创]django+ldap实现单点登录(装饰器和缓存)

    前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...

  8. PHP 装饰器模式

    装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...

  9. python cookbook 学习系列(一) python中的装饰器

    简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...

  10. python基础补漏-05-生成器和装饰器

    [1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...

随机推荐

  1. [转帖]SQL Server超过了每行的最大字节数(8060)的原因和解决办法

    一.现象     出现这种错误都发生在SQL语句建表时,错误提示: "警告: 已创建表 'XXXX,但其最大行大小(10438)超过了每行的最大字节数(8060).如果结果行长度超过 806 ...

  2. [转帖]Centos 7 查看磁盘io ,找出占用io读写很高的进程

    1,先用iostat查看磁盘io 是否读写负载很高 用iostat -x 1 10 如果 iostat 没有,要 yum install sysstat安装这个包,第一眼看下图红色圈圈的那个如果%ut ...

  3. Windows 磁盘部分性能数据获取

    Windows 磁盘部分性能数据获取 摘要 每次晚上加班总有收获 这次发现了一个fio for windows版本的压测程序, 准备学习和使用一下. https://github.com/axboe/ ...

  4. Oracle 建立数据库dblink 然后同步部分表内容的总结

    同步处理部分数据 背景 最近在项目上发现两个分库进行数据同步时部分内容同步存在问题. 最简单的方法是导表,但是害怕有其他关联信息异常, 所以同事想到了dblink的方式. 这里简单整理一下 同事用到的 ...

  5. 我们开源了一个轻量的 Web IDE UI 框架

    我们开源了一个轻量的 Web IDE UI 框架 Molecule 一个轻量的 Web IDE UI 框架 简介 Molecule 是一个受 VS Code 启发,使用 React.js 构建的 We ...

  6. 京东金融Android瘦身探索与实践

    作者:京东科技 冯建华 一.背景 随着业务不断迭代更新,App的大小也在快速增加,2019年~2022年期间一度超过了117M,期间我们也做了部分优化如图1红色部分所示,但在做优化的同时面临着新的增量 ...

  7. Windows 核心编程笔记 [2] 字符串

    1. ANSI 和 Unicode Windows 中涉及字符串的函数有两个版本 1)ANSI版本的函数会把字符串转换为Unicode形式,再从内部调用函数的Unicode版本 2)Unicode版本 ...

  8. Solon 框架启动为什么特别快?

    思来想去!可能与 Solon 容器的独立设计有一定关系. 1.Solon 注解容器的运行特点 有什么注解要处理的(注解能力被规范成了四种),提前注册登记 全局只扫描一次,并在扫描过程中统一处理注解相关 ...

  9. PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】

     相关文章: 基础知识介绍: [一]ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?_汀.的博客-CSDN博客_ernie模型 百度飞桨: ...

  10. 1.14 手工插入ShellCode反弹

    PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...