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

pet*_*ush 3 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)
Run Code Online (Sandbox Code Playgroud)

如何将此类重写为数据类

具体来说,如何id宣布该领域?它具有生成的值,而不是代码创建实例将提供的字段.

Mar*_*ers 8

只需将每个属性移动到类上带有类型注释的声明,其中类已经使用@dataclasses.dataclass装饰器进行了装饰.

您可以id__post_init__方法中生成值; 确保__init__使用dataclass.field()对象将其标记为免除参数:

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()}'
Run Code Online (Sandbox Code Playgroud)

演示:

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

  • @petrush:请不要移动球门柱。类方法在数据类上没有什么不同;我的问题中的示例基本上生成了与以前相同的 `__init__` 方法,您可以将类方法添加到该类中。 (2认同)
  • 要生成 ID,您还可以使用默认字段。例如 `id: str = field(default_factory=lambda: str(uuid.uuid4()))` (2认同)