我有以下课程:
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
字段?它具有一个生成的值,而不是创建实例的代码所提供的字段。
答案 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'))