dataclass装饰器
简介
根据定义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装饰器的更多相关文章
- Python 3.7 将引入 dataclass 装饰器
简评:Python 3.7 将于今年夏天发布,Python 3.7 中将会有许多新东西,最激动人心的新功能之一是 dataclass 装饰器. 什么是 Data Class 大多数 Python 开发 ...
- Python笔记_第四篇_高阶编程_再议装饰器和再议内置函数
1. 概述: 我们在前面用了很多的装饰器这个工具的方法.这个位置要系统的讲一下装饰器. 1.2 为什么需要装饰器. 装饰器本质是一个Python函数,它可以让其他函数在不需要任何代码变动的前提下增加额 ...
- Python 装饰器入门(下)
继续上次的进度:https://www.cnblogs.com/flashBoxer/p/9847521.html 正文: 装饰类 在类中有两种不通的方式使用装饰器,第一个和我们之前做过的函数非常相似 ...
- Python高手之路【四】python函数装饰器
def outer(func): def inner(): print('hello') print('hello') print('hello') r = func() print('end') p ...
- python装饰器
今天看了装饰器的一些内容,感觉@修饰符还是挺抽象的. 装饰器就是在不用改变函数实现的情况下,附加的实现一些功能,比如打印日志信息等.需要主意的是装饰器本质是一个高阶函数,她可以返回一个函数. 装饰器需 ...
- Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化
本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...
- [原创]django+ldap实现单点登录(装饰器和缓存)
前言 参考本系列之前的文章,我们已经搭建了ldap并且可以通过django来操作ldap了,剩下的就是下游系统的接入了,现在的应用场景,我是分了2个层次,第一层次是统一认证,保证各个系统通过ldap来 ...
- PHP 装饰器模式
装饰器模式:是在不必改变原类文件和使用继承的情况下,动态地扩展一个对象的功能. [装饰器模式中主要角色] 抽象组件角色(Component):定义一个对象接口,以规范准备接受附加责任的对象,即可以给这 ...
- python cookbook 学习系列(一) python中的装饰器
简介 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓 ...
- python基础补漏-05-生成器和装饰器
[1]生成器 很难用简单的语言描述生成器. 生成器:从字面上来理解,就是以某种规则为基础,不断的生成数据的工具 生成器函数: 在函数中如果出现了yield关键字,那么该函数就不再是普通函数,而是生成器 ...
随机推荐
- [转帖]SQL Server超过了每行的最大字节数(8060)的原因和解决办法
一.现象 出现这种错误都发生在SQL语句建表时,错误提示: "警告: 已创建表 'XXXX,但其最大行大小(10438)超过了每行的最大字节数(8060).如果结果行长度超过 806 ...
- [转帖]Centos 7 查看磁盘io ,找出占用io读写很高的进程
1,先用iostat查看磁盘io 是否读写负载很高 用iostat -x 1 10 如果 iostat 没有,要 yum install sysstat安装这个包,第一眼看下图红色圈圈的那个如果%ut ...
- Windows 磁盘部分性能数据获取
Windows 磁盘部分性能数据获取 摘要 每次晚上加班总有收获 这次发现了一个fio for windows版本的压测程序, 准备学习和使用一下. https://github.com/axboe/ ...
- Oracle 建立数据库dblink 然后同步部分表内容的总结
同步处理部分数据 背景 最近在项目上发现两个分库进行数据同步时部分内容同步存在问题. 最简单的方法是导表,但是害怕有其他关联信息异常, 所以同事想到了dblink的方式. 这里简单整理一下 同事用到的 ...
- 我们开源了一个轻量的 Web IDE UI 框架
我们开源了一个轻量的 Web IDE UI 框架 Molecule 一个轻量的 Web IDE UI 框架 简介 Molecule 是一个受 VS Code 启发,使用 React.js 构建的 We ...
- 京东金融Android瘦身探索与实践
作者:京东科技 冯建华 一.背景 随着业务不断迭代更新,App的大小也在快速增加,2019年~2022年期间一度超过了117M,期间我们也做了部分优化如图1红色部分所示,但在做优化的同时面临着新的增量 ...
- Windows 核心编程笔记 [2] 字符串
1. ANSI 和 Unicode Windows 中涉及字符串的函数有两个版本 1)ANSI版本的函数会把字符串转换为Unicode形式,再从内部调用函数的Unicode版本 2)Unicode版本 ...
- Solon 框架启动为什么特别快?
思来想去!可能与 Solon 容器的独立设计有一定关系. 1.Solon 注解容器的运行特点 有什么注解要处理的(注解能力被规范成了四种),提前注册登记 全局只扫描一次,并在扫描过程中统一处理注解相关 ...
- PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】
相关文章: 基础知识介绍: [一]ERNIE:飞桨开源开发套件,入门学习,看看行业顶尖持续学习语义理解框架,如何取得世界多个实战的SOTA效果?_汀.的博客-CSDN博客_ernie模型 百度飞桨: ...
- 1.14 手工插入ShellCode反弹
PE格式是 Windows下最常用的可执行文件格式,理解PE文件格式不仅可以了解操作系统的加载流程,还可以更好的理解操作系统对进程和内存相关的管理知识,而有些技术必须建立在了解PE文件格式的基础上,如 ...