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