Python 3.7数据类简介

Python 3.7中的一项全新功能是“数据类”。 数据类是一种为存储多个属性的类自动生成样板代码的方法。

它们还具有使用Python 3的新型提示的好处。

dataclasses来自Python 3.7的标准库中的新dataclasses模块中,您需要做两件事。

  1. dataclass装饰器,用于装饰数据类
  2. field方法,用于配置字段

默认魔术方法

在默认设置中,任何数据类都将为您实现__init____init__ __repr__ __init____repr__ __str____eq__

__init__方法将具有带有在类上指定的相同类型注释的关键字参数

__eq__方法将按顺序比较所有数据类属性。

所有字段都在类的顶部声明,并且需要类型提示。

__init__方法将具有(field_a: int, field_b: str) -> None的签名。 您只需输入print(inspect.signature(example.__init__))就可以看到

类型提示

非常重要的是,类型提示仅仅是提示。 因此,提供错误的类型不会发出警告或尝试进行转换。

由于类型提示是必需的 (否则,该字段将被忽略),如果您没有特定类型,请使用typing模块中的Any类型。

变异性

数据类装饰器具有frozen参数,默认情况下为False。 如果指定,则字段将被“ 冻结 ”,即只读,并且如果eq设置为True(默认情况下),则将实现__hash__魔术,对象实例将可哈希化,因此您可以将它们用作字典键或在其中使用一套。

自定义字段

数据类中的核心类型是Field类型,它属于数据类。

默认情况下,仅设置class属性将在您的类上实例化一个Field,如前面的示例所示。

如果需要自定义行为,则可以在dataclasses模块内使用字段工厂。

field()的参数为:

  • default :如果提供,则为该字段的默认值。 这是必需的,因为字段调用本身会替换默认值的常规位置。
  • default_factory :一个0参数的可调用对象,当此字段需要默认值时将被调用。
  • init :作为生成的__init__方法的参数包括在内。
  • repr :包含在生成的__repr__方法返回的字符串中。
  • compare :包含在生成的相等和比较方法中(__eq __,__ gt__等)。
  • hash :包含在生成的__hash__方法中。

还有另一个参数,元数据尚未使用。

与关键字参数类似,具有默认值的字段必须最后声明。

演示默认的工厂参数,

初始化后处理

您可以声明__post_init__方法,该方法将在自动生成的__init__之后运行。

遗产

继承可以按您期望的那样工作。 您需要将类中的dataclass包装为继承dataclass 基类定义。

尽管由于不能在默认字段之后声明非默认字段,所以不能在基类和子类之间混合使用默认字段和非默认字段。

此示例引发TypeError: non-default argument 'field_a' follows default argument

这很烦人,可能会阻止人们过多使用继承或默认字段。

总而言之,这是一个很棒的功能,一旦发布Python 3.7,我可能会停止使用attrs。

仍然停留在Python 2上吗?

查看我关于Pluralsight的新课程,该课程从Python 2过渡到3。

From: https://hackernoon.com/a-brief-tour-of-python-3-7-data-classes-22ee5e046517

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值