在 Python 数据 类 中混合实例属性和字段

Mixing instance attributes and fields in Python data classes

我想“混合搭配”实例属性和数据类字段,有效地将数据类扩展为具有可计算值的可选属性。我尝试通过使用默认数据类(因此没有显式初始化方法)来做到这一点,但在 __post_init__ 中实例化实例属性(不是字段)。不过,这似乎让我的 IDE 不满意,因为它警告我这些属性是“在 init 方法之外定义的”。

导入数据类 从键入 import Optional, List

@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__(默认值)时,您可能只想比较字段而不是其属性的 all

您可以通过使用 field() 将字段列在数据类中并将 init=Falsecompare=False 传递给 field 调用来管理字段,尽管我不确定这是不是你在找什么。