Python:dataclasses使用体验

522 阅读1分钟

适用于存储数据对象

基本使用

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)

  1. init=True 会自动生成__init__方法

  2. repr=True 会自动生成__repr__方法

  3. eq=True 会自动生成__eq__方法

  4. 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
    
  5. 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)