python3.7代码实例_Python3.7新特性

介绍

Python 3.7 中有一个新特性, 你可以使用一个装饰器 @dataclass来简化创建数据类的过程,新创建的数据类将自带有__init__和__repr__。

数据类是一种用来存储数据的类,这种类往往不需要自定义的方法。通常,我们也管它叫数据结构。例如,一个存储点的三维坐标值的类,往往就只需要三个字段 (x, y, z)。

然而,如果我们用以前的方式实现一个数据类,那我们不可避免地需要自己编写一个__init__方法,一个字符串表示的内置方法,和一个比较函数等等。这些方法的逻辑显而易见,如果语言能够自动地处理,那就再好不过了。

事实上,其他一些语言,如 Kotlin,已经提供了构建数据类的便捷方式,Java也可以通过Lombok库来使用 @Data标记构建数据类。

例子

这里是使用dataclass的一个例子

默认情况下,装饰器会自动生成初始化函数、比较函数和字符串表示函数。

换言之,上面代码等同于下面的旧式代码:

注意这个例子也可以使用 namedtuple完成,但是实现的代码可读性就差了很多,虽然确实比上面例子更短了:

DATACLASS参数

@dataclass装饰器可以接受几个参数来控制自动生成的方法的行为:init: 如果 True, 生成__init__方法。

repr: 如果 True, 生成__repr__方法。

eq: 如果 True, 生成__eq__方法,比较逻辑就是把数据当作一个元组来比较。

order: 如果 True, 生成__lt__,__le__,__gt__, 和__ge__方法。

unsafe_hash: 如果 False, 依据eq和frozen的值生成__hash__方法。 如果 True,生成__hash__方法。

frozen: 如果 True, 生成的对象就是不可变的 (只读).

字段配置

在 dataclasses模块中, 有一个field函数,它可以用来做字段级别的配置:

通过它你可以控制一个字段的默认值, 该字段是否应该显示在 __repr__中,是否应该被比较函数忽略,是否应该计算在__hash__中, 等等。

初始化后处理

生成的 __init__代码会调用一个叫__post_init__的函数。 如果你需要依据基础数据生成一些衍生数据,那么这个函数会很有用。 注意如果__init__方法没有生成, 那么__post_init__也不会执行。

其他DATACLASS方法

dataclasses 模块还提供了很多其他的有用的函数:fields: 返回Field对象的元组。 一个Field对象包含一个字段的配置。

asdict: 将数据类实例转换为对应字段的字典。

astuple: 将数据类实例转换为对应字段的元组。

make_dataclass: 动态创建一个数据类。

replace: 拷贝数据类实例,并修改部分字段。

is_dataclass: 判断一个对象是否是指定数据类的对象。

英文原文:https://www.codingame.com/playgrounds/37245/python-dataclass

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值