Python3.7 新特性之dataclass装饰器
Python3.7新增了一个dataclass装饰器,可以方便地创建带属性的类,并自动生成__init__、__repr__等方法和默认值。dataclass是Python标准库collections中的一部分,可以更容易地定义和使用一些简单的类,尤其是在数据处理中。
使用dataclass需要导入dataclass模块:
from dataclasses import dataclass
下面是一个简单的例子:
@dataclass
class Student:
name: str
age: int
grade: str = 'unknown'
s = Student('Lucy', 10)
print(s)
输出结果为:
Student(name='Lucy', age=10, grade='unknown')
通过使用dataclass,我们定义了一个Student类,它有三个属性:name、age和grade,其中grade属性有一个默认值'unknown'。我们创建了一个Student对象s,并将它输出到控制台。输出的结果是自动生成的__repr__方法的返回值。
dataclass内部会根据类定义自动生成一些方法,如__init__、__repr__、__eq__等。因此,我们不需要手动编写这些方法,当我们使用dataclass装饰器时,创建一个类实例时只需要提供必需的数据即可。
除了默认值属性,dataclass还支持属性类型注释、默认工厂函数等特性。下面是一个带有类型注释和默认工厂函数的例子:
from datetime import datetime
@dataclass
class Post:
title: str
body: str
date: datetime = datetime.now
p = Post('Dataclass in Python 3.7', 'Using dataclass in Python 3.7', datetime(2022, 8, 10))
print(p)
运行结果:
Post(title='Dataclass in Python 3.7', body='Using dataclass in Python 3.7', date=datetime.datetime(2022, 8, 10, 0, 0))
在这个例子中,我们定义了一个Post类,它有三个属性:title、body和date。属性date使用了默认工厂函数datetime.now,以便在创建Post对象时使用当前时间。属性title和body是字符串类型,而属性date是datetime类型。
dataclass还支持属性的默认值为其他属性的值。下面是一个例子:
@dataclass
class Rectangle:
width: float
height: float
area: float = 0.0
def __post_init__(self):
self.area = self.width * self.height
r = Rectangle(2, 3)
print(r)
输出结果:
Rectangle(width=2, height=3, area=6.0)
在这个例子中,我们定义了一个Rectangle类,它有width、height和area属性。属性area的默认值是0.0,但在类定义中我们会自动计算它的值。我们通过__post_init__方法来实现这个计算。这个方法会在创建对象实例时自动调用。在这个方法中,我们将area属性的值设置为width和height属性的乘积。
dataclass在类型注释方面非常灵活,可以使用标准库模块、类型别名、list和dict等。下面是一个例子:
from typing import List, Dict
@dataclass
class Book:
title: str
author: List[str]
publisher: Dict[str, str]
b = Book('Python Data Science Handbook', ['Jake VanderPlas'], {'O'Reilly': '2017'})
print(b)
运行结果:
Book(title='Python Data Science Handbook', author=['Jake VanderPlas'], publisher={"O'Reilly": '2017'})
在这个例子中,我们定义了一个Book类,它有三个属性:title、author和publisher。属性author使用了list类型注释,而属性publisher使用了dict类型注释。属性publisher还使用了单引号和双引号来定义一个key-value对。
总结一下,dataclass是Python3.7新增的一个强大功能,可以加速编写简单类的时间,帮助编写更容易,并且可以自动将默认值和类型注释添加到类方法。如果你在编写数据处理程序,dataclass是一个强大的工具,可以更快地编写和调试代码。
