适用于存储数据对象
基本使用
from dataclasses import dataclass
@dataclass
class test:
val:int
a = test(1)
print(a.val)
-----------------------------
1
添加默认值
@dataclass
class test:
val:int = 1
print(test.val)
print(test()) # 会自动添加__repr__方法,返回val
-----------------------------
1
test(val=1)
dataclass装饰器可以作用以下参数@dataclass(init=True, repr=True, eq=True, order=False, unsafe_hash=False, frozen=False)
-
init=True 会自动生成__init__方法
-
repr=True 会自动生成__repr__方法
-
eq=True 会自动生成__eq__方法
-
order=True 会自动生成__gt__大于,__ge__大于等于,__lt__小于,__le__小于等于方法
@dataclass(order=True) class num: a:int a = num(1) b = num(2) print(a > b) print(a < b) print(a >= b) print(a <= b) ------------------------------ False True False True -
frozen=True 修改对象属性时会引发FrozenInstanceError异常
@dataclass(frozen=True) class num: val: int = 1 a = num() print(a.val) a.val = 2 print(a.val) --------------------------------------------------------------- 1 '''Traceback: dataclasses.FrozenInstanceError: cannot assign to field 'val''' 1
__post_init__函数能够在__init__返回之前调用返回
import math
@dataclass
class num:
val:float = 0.001
def __post_init__(self):
self.decimal, self.integer = math.modf(self.val)
a = num()
print(a.interger)
print(a.decimal)
----------------------------------------
0
0.001
@dataclass
class fenxii:
data:str
name:str
time:str
使用dataclasses中的field 来定义默认参数
from dataclasses import field,dataclass
from typing import List
def get_marks():
return [random.randint(1,10) for _ in range(5)]
# default_factory 必须是一个可以调用的无参数方法(通常为一个函数)。
@dataclass
class Studnet:
marks: List[int] = field(default_factory=get_marks)