Смешивание атрибутов экземпляра и полей в классах данных Python

Я хотел бы смешивать и сопоставлять атрибуты экземпляра и поля класса данных, эффективно расширяя классы данных до дополнительных атрибутов с вычислимыми значениями. Я пытаюсь сделать это, используя класс данных по умолчанию (поэтому без явного метода инициализации), но создавая экземпляры атрибутов экземпляра (а не полей) в __post_init__. Это, похоже, не нравится моей IDE, поскольку предупреждает меня, что эти атрибуты были определены вне метода инициализации.

импорт классов данных из набора import Необязательно, Список

@dataclasses.dataclass
class Word:
    text: str

    def __post_init__(self):
        self.chars: List[str] = self.text.split()
        self.alt_text: Optional[str] = None
        self.alt_text_chars: Optional[List[str]] = None

    def add_alt_text(self, text: str):
        self.alt_text = text  # IDE complains that instance attribute is defined outside init
        self.alt_text_chars = text.split()  # IDE complains


word = Word("hello")
word.add_alt_text("good morning")

Означает ли это, что то, что я хочу достичь, невозможно, т.е. смешивать атрибуты экземпляра вместе с обычными полями класса данных? Или есть (PEP-y) обходной путь, который разрешен?

В качестве побочного примечания: иногда вы явно хотите, чтобы атрибуты не обрабатывались так же, как поля. Например, если в вашем классе данных установлено значение __eq__ (по умолчанию), вы можете сравнить ТОЛЬКО поля, но не все его атрибуты.


person Bram Vanroy    schedule 15.12.2020    source источник


Ответы (1)


Вы можете управлять полями, перечисляя их в классе данных, используя field() и передавая init=False и compare=False вызову field, хотя я не уверен, что это то, что вы ищете.

person progmatico    schedule 16.12.2020