Я хотел бы смешивать и сопоставлять атрибуты экземпляра и поля класса данных, эффективно расширяя классы данных до дополнительных атрибутов с вычислимыми значениями. Я пытаюсь сделать это, используя класс данных по умолчанию (поэтому без явного метода инициализации), но создавая экземпляры атрибутов экземпляра (а не полей) в __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__
(по умолчанию), вы можете сравнить ТОЛЬКО поля, но не все его атрибуты.