dataclass
是从Python3.7
版本开始,作为标准库中的模块被引入,提供便捷的数据类创建和管理方式。
Dataclass是Dataclasses模块的一种装饰器,当使用@dataclass装饰器时,会自动生成一些特殊的方法,包括:
__init__
: 根据类属性初始化实例。
__repr__
: 用于打印或调试时显示实例信息。
__eq__
: 用于比较两个实例是否相等。
还可以根据需要生成 __lt__
, __le__
, __gt__
, __ge__
等方法(通过 order=True
参数)。
不使用dataclass
class data:
def __init__(self, x,y):
self.x = x
self.y = y
def __repr__(self):
return f'data(x={self.x},y={self.y})'
d = data(1,2)
print(d)
输出
data(x=1,y=2)
from dataclasses import dataclass
@dataclass
class data:
x: int
y: int
# 使用数据类
d = data(1, 2)
print(d)
输出
data(x=1, y=2)
可以看到如果不使用dataclass装饰器,那么就只能手动去定义方法,使用dataclass则会非常简单方便。
下方给出更为详细的例子
class data:
def __init__(self, x ,y):
self.x = x
self.y = y
def __repr__(self):
return f'data(x={self.x},y={self.y})'
def __eq__(self,other):
return self.x == other.x and self.y == other.y
d_a = data(1,2)
d_b = data(1,3)
print(d_a)
print(d_a == d_b)
输出
data(x=1,y=2) False
from dataclasses import dataclass
@dataclass
class data:
x: int
y: int
# 使用数据类
d_a = data(1, 2)
d_b = data(1,3)
print(d_a)
print(d_a == d_b)
输出
data(x=1, y=2) False
我们想要加其他功能时都需要在类中增加方法,而dataclass则将一些数据常用的方法封装好了,直接使用即可
dataclass
默认不实现 __lt__
, __le__
, __gt__
, __ge__
方法,因此不能直接使用 <
, <=
, >
, >=
进行比较。可以通过在 @dataclass
装饰器中使用 order=True
参数,或者手动定义比较方法来实现。dataclasses
模块支持在 @dataclass
装饰器中使用 order=True
参数,自动生成比较方法。from dataclasses import dataclass
@dataclass(order=True)
class data:
x: int
y: int
# 使用数据类
d_a = data(1, 2)
d_b = data(2, 3)
d_c = data(0, 4)
print(d_a)
print(d_a < d_b)
print(d_a < d_c)
输出
data(x=1, y=2) True False
注意:
from dataclasses import dataclass
@dataclass
class data:
x: int
y: int
def __lt__(self,other):
if not isinstance(other,data):
return data
return self.x < other.x and self.y < other.y
# 使用数据类
d_a = data(1, 2)
d_b = data(2, 3)
d_c = data(1, 4)
print(d_a)
print(d_a < d_b)
print(d_a < d_c)
输出
data(x=1, y=2) True False
可以看到只有两个字段比较结果都是小于才返回true,这是因为在自己定义lt方法中使用的是and只有两个条件都满足才返回真
@dataclass
装饰器中设置 frozen=True
来使其实例不可变。from dataclasses import dataclass
@dataclass(frozen=True)
class data:
x: int
y: int
# 使用数据类
d_a = data(1, 2)
try:
d_a.x = 0
except AttributeError as e:
print(f'发生错误:{e}')
print(d_a)
输出
发生错误:cannot assign to field 'x' data(x=1, y=2)
__post_init__
方法from dataclasses import dataclass
@dataclass
class data:
x: int
y: int
z: int = 0
def __post_init__(self):
self.z = self.x + self.y
# 使用数据类
d_a = data(1, 2)
print(d_a)
输出
data(x=1, y=2, z=3)
property
装饰器。这允许定义一个方法来计算属性值,而不是在实例化时直接设置。from dataclasses import dataclass
@dataclass
class data:
x: int
y: int
@property
def total(self):
return self.x + self.y
# 使用数据类
d_a = data(1, 2)
print(f'结果是:{d_a.total}')
输出
结果是:3
__init__
方法,dataclass
会根据定义的属性自动生成。__repr__
方法,便于调试和日志记录。__eq__
方法,用于比较两个实例是否相等。__lt__
、__le__
、__gt__
、__ge__
方法,用于排序。__post_init__
方法在实例创建后执行额外的初始化逻辑。frozen=True
,可以创建不可变实例。