Python 3.7中的一项全新功能是“数据类”。 数据类是一种为存储多个属性的类自动生成样板代码的方法。
它们还具有使用Python 3的新型提示的好处。
dataclasses
来自Python 3.7的标准库中的新dataclasses
模块中,您需要做两件事。
-
dataclass
装饰器,用于装饰数据类 -
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