如何使用数据类生成字段值?

时间:2018-10-03 13:17:04

标签: python python-3.7 python-dataclasses

我有以下课程:

class WordItem:
    def __init__(self, phrase: str, word_type: WORD_TYPE):
        self.id = f'{phrase}_{word_type.name.lower()}'
        self.phrase = phrase
        self.word_type = word_type
        @classmethod

    def from_payload(cls, payload: Dict[str, Any]) -> 'WordItem':
        return cls(**payload)

如何将此类重写为dataclass

具体地说,应该如何声明id字段?它具有一个生成的值,而不是创建实例的代码所提供的字段。

1 个答案:

答案 0 :(得分:8)

只需将您的每个属性移到类上带有类型注释的声明中,该类已用@dataclasses.dataclass decorator装饰。

您可以在__post_init__ method中为id生成值;确保使用dataclass.field() object将其标记为不受__init__参数的限制:

from dataclasses import dataclass, field    

@dataclass
class WordItem:
    id: str = field(init=False)
    phrase: str
    word_type: WORD_TYPE

    def __post_init__(self):
        self.id = f'{self.phrase}_{self.word_type.name.lower()}'

演示:

>>> from types import SimpleNamespace
>>> wt = SimpleNamespace(name='Python')
>>> WordItem('await', wt)
WordItem(id='await_python', phrase='await', word_type=namespace(name='Python'))