Как использовать классы данных для генерации значения поля? - PullRequest
0 голосов
/ 03 октября 2018

У меня есть следующий класс:

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)

Как я могу переписать этот класс как класс данных ?

В частности, как должно быть поле idобъявили?У него есть сгенерированное значение, и оно не является полем, которое будут предоставлять экземпляры, создающие код.

1 Ответ

0 голосов
/ 03 октября 2018

Просто переместите каждый из ваших атрибутов в аннотированное объявление типа в классе, где класс был оформлен с помощью @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()}'

Демо:

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